View Javadoc
1   /*
2    * Copyright 2006 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.ole.fp.document.web.struts;
17  
18  import java.sql.Timestamp;
19  import java.util.ArrayList;
20  import java.util.HashMap;
21  import java.util.Iterator;
22  import java.util.List;
23  import java.util.Map;
24  import java.util.Properties;
25  import java.util.Set;
26  
27  import javax.servlet.http.HttpServletRequest;
28  import javax.servlet.http.HttpServletResponse;
29  
30  import org.apache.commons.lang.StringUtils;
31  import org.apache.struts.action.ActionForm;
32  import org.apache.struts.action.ActionForward;
33  import org.apache.struts.action.ActionMapping;
34  import org.kuali.ole.fp.businessobject.CashDrawer;
35  import org.kuali.ole.fp.businessobject.CashieringTransaction;
36  import org.kuali.ole.fp.businessobject.Check;
37  import org.kuali.ole.fp.businessobject.CoinDetail;
38  import org.kuali.ole.fp.businessobject.CurrencyDetail;
39  import org.kuali.ole.fp.businessobject.Deposit;
40  import org.kuali.ole.fp.businessobject.DepositWizardCashieringCheckHelper;
41  import org.kuali.ole.fp.businessobject.DepositWizardHelper;
42  import org.kuali.ole.fp.businessobject.format.CashDrawerStatusCodeFormatter;
43  import org.kuali.ole.fp.document.CashManagementDocument;
44  import org.kuali.ole.fp.document.CashReceiptDocument;
45  import org.kuali.ole.fp.document.service.CashManagementService;
46  import org.kuali.ole.fp.document.service.CashReceiptService;
47  import org.kuali.ole.fp.exception.CashDrawerStateException;
48  import org.kuali.ole.fp.service.CashDrawerService;
49  import org.kuali.ole.sys.OLEConstants;
50  import org.kuali.ole.sys.OLEConstants.CashDrawerConstants;
51  import org.kuali.ole.sys.OLEConstants.DocumentStatusCodes.CashReceipt;
52  import org.kuali.ole.sys.OLEKeyConstants;
53  import org.kuali.ole.sys.OLEPropertyConstants;
54  import org.kuali.ole.sys.businessobject.Bank;
55  import org.kuali.ole.sys.context.SpringContext;
56  import org.kuali.ole.sys.document.datadictionary.FinancialSystemTransactionalDocumentEntry;
57  import org.kuali.rice.core.api.datetime.DateTimeService;
58  import org.kuali.rice.core.api.util.type.KualiDecimal;
59  import org.kuali.rice.core.web.format.CurrencyFormatter;
60  import org.kuali.rice.kew.api.exception.WorkflowException;
61  import org.kuali.rice.kim.api.identity.Person;
62  import org.kuali.rice.kns.document.authorization.DocumentAuthorizer;
63  import org.kuali.rice.kns.document.authorization.TransactionalDocumentAuthorizer;
64  import org.kuali.rice.kns.document.authorization.TransactionalDocumentPresentationController;
65  import org.kuali.rice.kns.service.DataDictionaryService;
66  import org.kuali.rice.kns.service.DocumentHelperService;
67  import org.kuali.rice.kns.web.struts.action.KualiAction;
68  import org.kuali.rice.krad.service.BusinessObjectService;
69  import org.kuali.rice.krad.service.DocumentService;
70  import org.kuali.rice.krad.util.GlobalVariables;
71  import org.kuali.rice.krad.util.KRADConstants;
72  import org.kuali.rice.krad.util.UrlFactory;
73  
74  /**
75   * This class handles actions for the deposit wizard, which is used to create deposits that bundle groupings of Cash Receipt
76   * documents.
77   */
78  public class DepositWizardAction extends KualiAction {
79      private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DepositWizardAction.class);
80      private static final String CASH_MANAGEMENT_STATUS_PAGE = "/cashManagementStatus.do";
81  
82      /**
83       * Overrides the parent to validate the document state of the cashManagementDocument which will be updated and redisplayed after
84       * the DepositWizard builds and attaches the new Deposit.
85       *
86       * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm,
87       *      javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
88       */
89      @Override
90      public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
91          DepositWizardForm dwForm = (DepositWizardForm) form;
92  
93          ActionForward dest = super.execute(mapping, form, request, response);
94  
95          // check authorization manually, since the auth-check isn't inherited by this class
96          DocumentAuthorizer cmDocAuthorizer = SpringContext.getBean(DocumentHelperService.class).getDocumentAuthorizer(OLEConstants.FinancialDocumentTypeCodes.CASH_MANAGEMENT);
97          Person luser = GlobalVariables.getUserSession().getPerson();
98          cmDocAuthorizer.canInitiate(OLEConstants.FinancialDocumentTypeCodes.CASH_MANAGEMENT, luser);
99  
100         // populate the outgoing form used by the JSP if it seems empty
101         String cmDocId = dwForm.getCashManagementDocId();
102         if (StringUtils.isBlank(cmDocId)) {
103             cmDocId = request.getParameter("cmDocId");
104             String depositTypeCode = request.getParameter("depositTypeCode");
105 
106             CashManagementDocument cmDoc = (CashManagementDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(cmDocId);
107 
108             try {
109                 initializeForm(dwForm, cmDoc, depositTypeCode);
110             }
111             catch (CashDrawerStateException cdse) {
112                 dest = new ActionForward(UrlFactory.parameterizeUrl(CASH_MANAGEMENT_STATUS_PAGE, cdse.toProperties()), true);
113             }
114         } else { // for recalculation
115             loadCashReceipts(dwForm);
116             loadUndepositedCashieringChecks(dwForm);
117             if (dwForm.getTargetDepositAmount() == null) {
118                 calculateTargetFinalDepositAmount(dwForm);
119             }
120             //loadEditModesAndDocumentActions(dwForm);
121         }
122 
123         return dest;
124     }
125 
126     /**
127      * Initializes the given form using the given values
128      *
129      * @param dform
130      * @param cmDoc
131      * @param depositTypeCode
132      */
133     private void initializeForm(DepositWizardForm dform, CashManagementDocument cmDoc, String depositTypeCode) {
134         CashDrawer cd = SpringContext.getBean(CashDrawerService.class).getByCampusCode(cmDoc.getCampusCode());
135         if (cd == null) {
136             throw new RuntimeException("No cash drawer exists for campus code " + cmDoc.getCampusCode() + "; please create on via the Cash Drawer Maintenance Document before attemping to create a CashManagementDocument for campus " + cmDoc.getCampusCode());
137         }
138         if (!cd.isOpen()) {
139             CashDrawerStatusCodeFormatter f = new CashDrawerStatusCodeFormatter();
140 
141             String cmDocId = cmDoc.getDocumentNumber();
142             String currentState = cd.getStatusCode();
143 
144             throw new CashDrawerStateException(cmDoc.getCampusCode(), cmDocId, (String) f.format(CashDrawerConstants.STATUS_OPEN), (String) f.format(cd.getStatusCode()));
145         }
146 
147         dform.setCashManagementDocId(cmDoc.getDocumentNumber());
148         dform.setCashDrawerCampusCode(cmDoc.getCampusCode());
149 
150         dform.setDepositTypeCode(depositTypeCode);
151 
152         if (depositTypeCode.equals(OLEConstants.DocumentStatusCodes.CashReceipt.FINAL)) {
153             // hey, we're the magical final deposit. We get currency and coin details!
154             CurrencyDetail currencyDetail = new CurrencyDetail();
155             currencyDetail.setDocumentNumber(cmDoc.getDocumentNumber());
156             currencyDetail.setCashieringStatus(OLEConstants.CurrencyCoinSources.DEPOSITS);
157             currencyDetail.setFinancialDocumentTypeCode(CashieringTransaction.DETAIL_DOCUMENT_TYPE);
158             dform.setCurrencyDetail(currencyDetail);
159 
160             CoinDetail coinDetail = new CoinDetail();
161             coinDetail.setDocumentNumber(cmDoc.getDocumentNumber());
162             coinDetail.setCashieringStatus(OLEConstants.CurrencyCoinSources.DEPOSITS);
163             coinDetail.setFinancialDocumentTypeCode(CashieringTransaction.DETAIL_DOCUMENT_TYPE);
164             dform.setCoinDetail(coinDetail);
165         }
166 
167         loadCashReceipts(dform);
168         loadUndepositedCashieringChecks(dform);
169         if (dform.isDepositFinal() && dform.getTargetDepositAmount() == null) {
170             calculateTargetFinalDepositAmount(dform);
171         }
172         loadEditModesAndDocumentActions(dform);
173     }
174 
175     /**
176      * Loads the CashReceipt information, re/setting the related form fields
177      *
178      * @param dform
179      */
180     private void loadCashReceipts(DepositWizardForm dform) {
181         List<CashReceiptDocument> verifiedReceipts = SpringContext.getBean(CashReceiptService.class).getCashReceipts(dform.getCashDrawerCampusCode(), new String[] { CashReceipt.VERIFIED, CashReceipt.INTERIM });
182         dform.setDepositableCashReceipts(new ArrayList());
183         dform.setCheckFreeCashReceipts(new ArrayList<CashReceiptDocument>());
184 
185         // prepopulate DepositWizardHelpers
186         int index = 0;
187         for (Iterator i = verifiedReceipts.iterator(); i.hasNext();) {
188             CashReceiptDocument receipt = (CashReceiptDocument) i.next();
189             receipt.processAfterRetrieve(); // To populate Currency and Coin details
190             String docStatus = receipt.getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode();
191             if (docStatus.equalsIgnoreCase(CashReceipt.VERIFIED)) { // for interim or final deposit
192                 if (receipt.getCheckCount() == 0 && receipt.getTotalConfirmedCheckAmount().equals(KualiDecimal.ZERO)) {
193                     dform.getCheckFreeCashReceipts().add(receipt);
194                 }
195                 else {
196                     dform.getDepositableCashReceipts().add(receipt);
197                     DepositWizardHelper d = dform.getDepositWizardHelper(index++);
198                     // KFSMI-5232 Jira fix. Convert the time stamp to SQL date format
199                     Timestamp ts = new Timestamp(receipt.getDocumentHeader().getWorkflowDocument().getDateCreated().getMillis());
200                     try {
201                         d.setCashReceiptCreateDate(SpringContext.getBean(DateTimeService.class).convertToSqlDate(ts));
202                     }
203                     catch (Exception e) {
204 
205                     }
206                 }
207             }
208             else if (docStatus.equalsIgnoreCase(CashReceipt.INTERIM)) { // for final deposit
209                 // checks are already deposited but there are cash to be deposited
210                 if (receipt.getTotalConfirmedCashAmount().isGreaterThan(KualiDecimal.ZERO)) {
211                     dform.getCheckFreeCashReceipts().add(receipt);
212                 }
213             }
214             dform.addCashReceiptToChecks(receipt);
215         }
216     }
217     
218     /**
219      * Loads cashiering transactions for final deposit target amount
220      * @param dwform
221      */
222     private void calculateTargetFinalDepositAmount(DepositWizardForm dwform) {
223         final CashReceiptService cashReceiptService = SpringContext.getBean(CashReceiptService.class);
224         final List<CashReceiptDocument> interestingReceipts = 
225                 cashReceiptService.getCashReceipts(dwform.getCashDrawerCampusCode(), new String[] { CashReceipt.VERIFIED, CashReceipt.INTERIM, CashReceipt.FINAL });
226         for (CashReceiptDocument crDoc : interestingReceipts) {
227             crDoc.refreshCashDetails();
228             dwform.addCashReceiptToTargetTotal(crDoc);
229         }
230 
231         final CashManagementService cashManagementService = SpringContext.getBean(CashManagementService.class);
232         KualiDecimal toBeDepositedChecksTotal = KualiDecimal.ZERO;
233         for (Check check : cashManagementService.selectUndepositedCashieringChecks(dwform.getCashManagementDocId())) {
234             toBeDepositedChecksTotal = toBeDepositedChecksTotal.add(check.getAmount());
235         }
236         // since final, include deposited checks as well (see OLECNTRB-160)
237         for (Check check : cashManagementService.selectDepositedCashieringChecks(dwform.getCashManagementDocId())) {
238             toBeDepositedChecksTotal = toBeDepositedChecksTotal.add(check.getAmount());
239         }
240         dwform.addCashieringTransactionToTargetTotal(toBeDepositedChecksTotal);
241     }
242 
243     /**
244      * This loads any cashiering checks which have not yet been deposited into the DepositWizardForm
245      *
246      * @param dform a form to load undeposited checks into
247      */
248     private void loadUndepositedCashieringChecks(DepositWizardForm dform) {
249         List<Check> cashieringChecks = SpringContext.getBean(CashManagementService.class).selectUndepositedCashieringChecks(dform.getCashManagementDocId());
250         dform.setDepositableCashieringChecks(cashieringChecks);
251     }
252 
253     private void loadEditModesAndDocumentActions(DepositWizardForm dform) {
254         final FinancialSystemTransactionalDocumentEntry ddEntry = getCashManagementDataDictionaryEntry();
255         final TransactionalDocumentPresentationController presentationController = getCashManagementPresentationController(ddEntry);
256         final TransactionalDocumentAuthorizer docAuthorizer = getCashManagementDocumentAuthorizer(ddEntry);
257 
258         dform.setEditingMode(retrieveEditingModes(dform.getCashManagementDocId(), presentationController, docAuthorizer));
259         dform.setDocumentActions(retrieveDocumentActions(dform.getCashManagementDocId(), presentationController, docAuthorizer));
260     }
261 
262     /**
263      * @return the class of the cash management document
264      */
265     protected String getCashManagementDocumentTypeName() {
266         return "CMD";
267     }
268 
269     /**
270      * @return the data dictionary entry for the cash management class
271      */
272     private FinancialSystemTransactionalDocumentEntry getCashManagementDataDictionaryEntry() {
273         final DataDictionaryService ddService = SpringContext.getBean(DataDictionaryService.class);
274         return (FinancialSystemTransactionalDocumentEntry)ddService.getDataDictionary().getDocumentEntry(getCashManagementDocumentTypeName());
275     }
276 
277     /**
278      * Returns an instance of the document presentation controller for the cash management class
279      * @param cashManagementEntry the data dictionary entry for the cash management document
280      * @return an instance of the proper document presentation controller
281      */
282     private TransactionalDocumentPresentationController getCashManagementPresentationController(FinancialSystemTransactionalDocumentEntry cashManagementEntry) {
283         final Class presentationControllerClass = cashManagementEntry.getDocumentPresentationControllerClass();
284         TransactionalDocumentPresentationController presentationController = null;
285         try {
286             presentationController = (TransactionalDocumentPresentationController)presentationControllerClass.newInstance();
287         }
288         catch (InstantiationException ie) {
289             throw new RuntimeException("Could not instantiate cash management presentation controller of class " + presentationControllerClass.getName(), ie);
290         }
291         catch (IllegalAccessException iae) {
292             throw new RuntimeException("Could not instantiate cash management presentation controller of class " + presentationControllerClass.getName(), iae);
293         }
294         return presentationController;
295     }
296 
297     /**
298      * Returns an instance of the document authorizer for the cash management class
299      * @param cashManagementEntry the data dictionary entry for the cash management document
300      * @return an instance of the proper document authorizer
301      */
302     private TransactionalDocumentAuthorizer getCashManagementDocumentAuthorizer(FinancialSystemTransactionalDocumentEntry cashManagementEntry) {
303         final Class docAuthorizerClass = cashManagementEntry.getDocumentAuthorizerClass();
304         TransactionalDocumentAuthorizer docAuthorizer = null;
305         try {
306             docAuthorizer = (TransactionalDocumentAuthorizer)docAuthorizerClass.newInstance();
307         }
308         catch (InstantiationException ie) {
309             throw new RuntimeException("Could not instantiate cash management document authorizer of class " + docAuthorizerClass.getName(), ie);
310         }
311         catch (IllegalAccessException iae) {
312             throw new RuntimeException("Could not instantiate cash management document authorizer of class " + docAuthorizerClass.getName(), iae);
313         }
314         return docAuthorizer;
315     }
316 
317     /**
318      * Retrieves the edit modes for the given cash management document
319      * @param cashManagementDocId the id of the cash management document to check
320      * @param presentationController the presentation controller of the cash management document
321      * @param docAuthorizer the cash management document authorizer
322      * @return a Map of edit modes
323      */
324     private Map retrieveEditingModes(String cashManagementDocId, TransactionalDocumentPresentationController presentationController, TransactionalDocumentAuthorizer docAuthorizer) {
325         Map editModeMap = null;
326         try {
327             final CashManagementDocument cmDoc = (CashManagementDocument)SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(cashManagementDocId);
328             Set<String> editModes = presentationController.getEditModes(cmDoc);
329             editModes = docAuthorizer.getEditModes(cmDoc, GlobalVariables.getUserSession().getPerson(), editModes);
330             editModeMap = convertSetToMap(editModes);
331         }
332         catch (WorkflowException we) {
333             throw new RuntimeException("Workflow exception while retrieving document " + cashManagementDocId, we);
334         }
335         return editModeMap;
336     }
337 
338     /**
339      * Retrieves the document actions for the given cash management document
340      * @param cashManagementDocId the id of the cash management document to check
341      * @param presentationController the presentation controller of the cash management document
342      * @param docAuthorizer the cash management document authorizer
343      * @return a Map of document actions
344      */
345     private Map retrieveDocumentActions(String cashManagementDocId, TransactionalDocumentPresentationController presentationController, TransactionalDocumentAuthorizer docAuthorizer) {
346         Map documentActionsMap = null;
347         try {
348             final CashManagementDocument cmDoc = (CashManagementDocument)SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(cashManagementDocId);
349             Set<String> documentActions = presentationController.getDocumentActions(cmDoc);
350             documentActions = docAuthorizer.getEditModes(cmDoc, GlobalVariables.getUserSession().getPerson(), documentActions);
351             documentActionsMap = convertSetToMap(documentActions);
352         }
353         catch (WorkflowException we) {
354             throw new RuntimeException("Workflow exception while retrieving document " + cashManagementDocId, we);
355         }
356         return documentActionsMap;
357     }
358 
359     /**
360      * Converts a set into a map, where each value in the set becomes a key and each value becomes KNSConstants.KUALI_DEFAULT_TRUE_VALUE
361      * @param s a set
362      * @return a map
363      */
364     protected Map convertSetToMap(Set s){
365         Map map = new HashMap();
366         Iterator i = s.iterator();
367         while(i.hasNext()) {
368             Object key = i.next();
369             map.put(key, KRADConstants.KUALI_DEFAULT_TRUE_VALUE);
370         }
371         return map;
372     }
373 
374     /**
375      * Reloads the CashReceipts, leaving everything else unchanged
376      *
377      * @see org.kuali.rice.kns.web.struts.action.KualiAction#refresh(org.apache.struts.action.ActionMapping,
378      *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
379      */
380     @Override
381     public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
382         loadCashReceipts((DepositWizardForm) form);
383         loadUndepositedCashieringChecks((DepositWizardForm) form);
384         if (((DepositWizardForm) form).isDepositFinal() && ((DepositWizardForm)form).getTargetDepositAmount() == null) {
385             calculateTargetFinalDepositAmount((DepositWizardForm) form);
386         }
387         loadEditModesAndDocumentActions((DepositWizardForm) form);
388 
389         return super.refresh(mapping, form, request, response);
390     }
391 
392     /**
393      * This method is the starting point for the deposit document wizard.
394      *
395      * @param mapping
396      * @param form
397      * @param request
398      * @param response
399      * @return ActionForward
400      * @throws Exception
401      */
402     public ActionForward startWizard(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
403         return mapping.findForward(OLEConstants.MAPPING_BASIC);
404     }
405 
406     /**
407      * This method is the action method for creating the new deposit document from the information chosen by the user in the UI.
408      *
409      * @param mapping
410      * @param form
411      * @param request
412      * @param response
413      * @return ActionForward
414      */
415     public ActionForward createDeposit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
416         ActionForward dest = mapping.findForward(OLEConstants.MAPPING_BASIC);
417 
418         DepositWizardForm dform = (DepositWizardForm) form;
419         final BusinessObjectService boService = SpringContext.getBean(BusinessObjectService.class);
420         final CashReceiptService cashReceiptService = SpringContext.getBean(CashReceiptService.class);
421         final DocumentService documentService = SpringContext.getBean(DocumentService.class);
422         final CashManagementService cashManagementService = SpringContext.getBean(CashManagementService.class);
423 
424         CurrencyFormatter formatter = new CurrencyFormatter();
425 
426         // reload edit modes and summary totals - just in case we have to return to the deposit wizard page
427         loadCashReceipts((DepositWizardForm) form);
428         if (((DepositWizardForm) form).isDepositFinal() && ((DepositWizardForm)form).getTargetDepositAmount() == null) {
429             calculateTargetFinalDepositAmount((DepositWizardForm) form);
430         }
431         loadEditModesAndDocumentActions(dform);
432 
433         // validate Bank
434         String bankCode = dform.getBankCode();
435         if (StringUtils.isBlank(bankCode)) {
436             GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_MISSING_BANK);
437         }
438         else {
439             Map keyMap = new HashMap();
440             keyMap.put(OLEPropertyConstants.BANK_CODE, bankCode);
441 
442             Bank bank = boService.findByPrimaryKey(Bank.class, keyMap);
443             if (bank == null) {
444                 GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_UNKNOWN_BANK, bankCode);
445             }
446             else {
447                 dform.setBank(bank);
448             }
449         }
450 
451         boolean depositIsFinal = (StringUtils.equals(dform.getDepositTypeCode(), OLEConstants.DepositConstants.DEPOSIT_TYPE_FINAL));
452 
453         // validate cashReceipt selection
454         List selectedIds = new ArrayList();
455         for (Iterator i = dform.getDepositWizardHelpers().iterator(); i.hasNext();) {
456             String checkValue = ((DepositWizardHelper) i.next()).getSelectedValue();
457 
458             if (StringUtils.isNotBlank(checkValue) && !checkValue.equals(OLEConstants.ParameterValues.NO)) {
459                 // removed apparently-unnecessary test for !checkValue.equals(OLEConstants.ParameterValues.YES)
460                 selectedIds.add(checkValue);
461             }
462         }
463 
464         if (depositIsFinal) {
465             // add check free cash receipts to the selected receipts so they are automatically deposited
466             dform.setCheckFreeCashReceipts(new ArrayList<CashReceiptDocument>());
467             List<CashReceiptDocument> cashReceipts = cashReceiptService.getCashReceipts(dform.getCashDrawerCampusCode(), new String[] {CashReceipt.VERIFIED, CashReceipt.INTERIM});
468             for (Object crDocObj : cashReceipts) {
469                 CashReceiptDocument crDoc = (CashReceiptDocument) crDocObj;
470                 crDoc.refreshCashDetails();
471                 if (crDoc.getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode().equals(CashReceipt.VERIFIED) && crDoc.getCheckCount() == 0) {
472                     // it's check free; it is automatically deposited as part of the final deposit
473                     selectedIds.add(crDoc.getDocumentNumber());
474                     dform.getCheckFreeCashReceipts().add(crDoc);
475                 }
476                 else if (crDoc.getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode().equals(CashReceipt.INTERIM) &&
477                         crDoc.getGrandTotalConfirmedCashAmount().isGreaterThan(KualiDecimal.ZERO)) {
478 //                        crDoc.setChecks(null);
479 //                        crDoc.setConfirmedChecks(new ArrayList<Check>());
480 //                        crDoc.setTotalConfirmedCheckAmount(null);
481                         selectedIds.add(crDoc.getDocumentNumber());
482                         dform.getCheckFreeCashReceipts().add(crDoc);
483                 }
484             }
485         }
486 
487         // make a list of cashiering checks to deposit
488         List<Integer> selectedCashieringChecks = new ArrayList<Integer>();
489         for (DepositWizardCashieringCheckHelper helper : dform.getDepositWizardCashieringCheckHelpers()) {
490             if (helper.getSequenceId() != null && !helper.getSequenceId().equals(new Integer(-1))) {
491                 selectedCashieringChecks.add(helper.getSequenceId());
492             }
493         }
494 
495         if (selectedIds.isEmpty() && selectedCashieringChecks.isEmpty()) {
496             GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_CASHRECEIPT_ERROR, OLEKeyConstants.Deposit.ERROR_NO_CASH_RECEIPTS_SELECTED);
497         }
498 
499         //
500         // proceed, if possible
501         if (GlobalVariables.getMessageMap().hasNoErrors()) {
502             try {
503                 // retrieve selected receipts
504                 List selectedReceipts = new ArrayList();
505                 if (selectedIds != null && !selectedIds.isEmpty()) {
506                     selectedReceipts = documentService.getDocumentsByListOfDocumentHeaderIds(CashReceiptDocument.class, selectedIds);
507                 }
508 
509                 if (depositIsFinal) {
510                     // have all verified CRs been deposited? If not, that's an error
511 //                    List verifiedReceipts = cashReceiptService.getCashReceipts(dform.getCashDrawerCampusCode(), new String[] {CashReceipt.VERIFIED, CashReceipt.INTERIM});
512 //                    for (Object o : verifiedReceipts) {
513 //                        CashReceiptDocument crDoc = (CashReceiptDocument) o;
514 //                        if (!selectedReceipts.contains(crDoc)) {
515 //                            GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NON_DEPOSITED_VERIFIED_CASH_RECEIPT, new String[] { crDoc.getDocumentNumber() });
516 //                        }
517 //                    }
518                     KualiDecimal toBeDepositedChecksTotal = KualiDecimal.ZERO;
519                     // have we selected the rest of the undeposited checks?
520                     for (Check check : cashManagementService.selectUndepositedCashieringChecks(dform.getCashManagementDocId())) {
521                         if (!selectedCashieringChecks.contains(check.getSequenceId())) {
522                             GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_CASHIERING_CHECK_MUST_BE_DEPOSITED, new String[] { check.getCheckNumber() });
523                         }
524                         else {
525                             toBeDepositedChecksTotal = toBeDepositedChecksTotal.add(check.getAmount());
526                         }
527                     }
528                     // add the rest of the deposited cashiering checks to the toBeDepositedChecksTotal
529                     for (Check check : cashManagementService.selectDepositedCashieringChecks(dform.getCashManagementDocId())) {
530                         toBeDepositedChecksTotal = toBeDepositedChecksTotal.add(check.getAmount());
531                     }
532 
533                     // does the cash drawer have enough currency and coin to fulfill the requested deposit?
534                     checkEnoughCurrencyForDeposit(dform);
535                     checkEnoughCoinForDeposit(dform);
536 
537                     // does this deposit have currency and coin to match all currency and coin from CRs?
538                     List<CashReceiptDocument> interestingReceipts = cashReceiptService.getCashReceipts(dform.getCashDrawerCampusCode(), new String[] { CashReceipt.VERIFIED, CashReceipt.INTERIM, CashReceipt.FINAL });
539                     CurrencyDetail currencyTotal = new CurrencyDetail();
540                     CoinDetail coinTotal = new CoinDetail();
541                     for (CashReceiptDocument receipt : interestingReceipts) {
542                         receipt.refreshCashDetails();
543                         if (receipt.getCurrencyDetail() != null) {
544                             currencyTotal.add(receipt.getConfirmedCurrencyDetail());
545                             currencyTotal.subtract(receipt.getChangeCurrencyDetail());
546                         }
547                         if (receipt.getCoinDetail() != null) {
548                             coinTotal.add(receipt.getConfirmedCoinDetail());
549                             coinTotal.subtract(receipt.getChangeCoinDetail());
550                         }
551                     }
552 
553                     KualiDecimal cashReceiptCashTotal = currencyTotal.getTotalAmount().add(coinTotal.getTotalAmount());
554                     // remove the cashiering checks amounts from the cash receipts total; cashiering checks act as if they were CR
555                     // currency/coin that gets deposited
556                     cashReceiptCashTotal = cashReceiptCashTotal.subtract(toBeDepositedChecksTotal);
557                     KualiDecimal depositedCashTotal = dform.getCurrencyDetail().getTotalAmount().add(dform.getCoinDetail().getTotalAmount());
558                     if (!cashReceiptCashTotal.equals(depositedCashTotal)) {
559                         GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_CASH_DEPOSIT_DID_NOT_BALANCE, new String[] { formatter.format(depositedCashTotal).toString(), formatter.format(cashReceiptCashTotal).toString() });
560                     }
561                 }
562 
563                 // proceed again...if possible
564                 if (GlobalVariables.getMessageMap().hasNoErrors()) {
565                     // retrieve CashManagementDocument
566                     String cashManagementDocId = dform.getCashManagementDocId();
567                     CashManagementDocument cashManagementDoc = null;
568                     try {
569                         cashManagementDoc = (CashManagementDocument) documentService.getByDocumentHeaderId(cashManagementDocId);
570                         if (cashManagementDoc == null) {
571                             throw new IllegalStateException("unable to find cashManagementDocument with id " + cashManagementDocId);
572                         }
573                     }
574                     catch (WorkflowException e) {
575                         throw new IllegalStateException("unable to retrieve cashManagementDocument with id " + cashManagementDocId, e);
576                     }
577 
578                     // create deposit
579                     String cmDocId = dform.getCashManagementDocId();
580 
581                     cashManagementService.addDeposit(cashManagementDoc, dform.getDepositTicketNumber(), dform.getBank(), selectedReceipts, selectedCashieringChecks, depositIsFinal);
582 
583                     if (depositIsFinal) {
584                         // find the final deposit
585                         Deposit finalDeposit = findFinalDeposit(cashManagementDoc);
586                         // if the currency and coin details aren't empty, save them and remove them from the cash drawer
587                         if (dform.getCurrencyDetail() != null) {
588                             // do we have enough currency to allow the deposit to leave the drawer?
589                             boService.save(dform.getCurrencyDetail());
590                             cashManagementDoc.getCashDrawer().removeCurrency(dform.getCurrencyDetail());
591                             finalDeposit.setDepositAmount(finalDeposit.getDepositAmount().add(dform.getCurrencyDetail().getTotalAmount()));
592                         }
593                         if (dform.getCoinDetail() != null) {
594                             // do we have enough coin to allow the deposit to leave the drawer?
595                             boService.save(dform.getCoinDetail());
596                             cashManagementDoc.getCashDrawer().removeCoin(dform.getCoinDetail());
597                             finalDeposit.setDepositAmount(finalDeposit.getDepositAmount().add(dform.getCoinDetail().getTotalAmount()));
598                         }
599                         boService.save(cashManagementDoc.getCashDrawer());
600                         boService.save(finalDeposit);
601                     }
602 
603                     // redirect to controlling CashManagementDocument
604                     dest = returnToSender(cashManagementDocId);
605                 }
606             }
607             catch (WorkflowException e) {
608                 throw new IllegalArgumentException("unable to retrieve cashReceipts by documentId", e);
609             }
610         }
611 
612         return dest;
613     }
614 
615     private Deposit findFinalDeposit(CashManagementDocument cmDoc) {
616         Deposit finalDeposit = null;
617         for (Deposit deposit : cmDoc.getDeposits()) {
618             if (deposit.getDepositTypeCode().equals(OLEConstants.DepositConstants.DEPOSIT_TYPE_FINAL)) {
619                 finalDeposit = deposit;
620                 break;
621             }
622         }
623         return finalDeposit;
624     }
625 
626     /**
627      * Checks that the currency amount requested to be part of a deposit can be fulfilled by the amount of currency in the cash
628      * drawer
629      *
630      * @param depositForm the deposit form we are checking against
631      * @param detail the currency detail to check against the drawer
632      * @return true if enough currency, false if otherwise
633      */
634     private boolean checkEnoughCurrencyForDeposit(DepositWizardForm depositForm) {
635         boolean success = true;
636         CurrencyDetail detail = depositForm.getCurrencyDetail();
637         if (detail != null) {
638             // 1. get the cash drawer
639             CashDrawer drawer = SpringContext.getBean(CashDrawerService.class).getByCampusCode(depositForm.getCashDrawerCampusCode());
640             // assumptions at this point:
641             // 1. a cash drawer does exist for the unit
642             // 2. we can ignore negative amounts, because if we have negative amounts, we're actually gaining money (and that will
643             // happen with cashiering checks)
644             CurrencyFormatter formatter = new CurrencyFormatter();
645             if (detail.getFinancialDocumentHundredDollarAmount() != null && detail.getFinancialDocumentHundredDollarAmount().isGreaterThan(KualiDecimal.ZERO)) {
646                 if (drawer.getFinancialDocumentHundredDollarAmount() == null || drawer.getFinancialDocumentHundredDollarAmount().isLessThan(detail.getFinancialDocumentHundredDollarAmount())) {
647                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "hundred dollar amount", formatter.format(detail.getFinancialDocumentHundredDollarAmount()).toString(), formatter.format(drawer.getFinancialDocumentHundredDollarAmount()).toString() });
648                     success = false;
649                 }
650             }
651             if (detail.getFinancialDocumentFiftyDollarAmount() != null && detail.getFinancialDocumentFiftyDollarAmount().isGreaterThan(KualiDecimal.ZERO)) {
652                 if (drawer.getFinancialDocumentFiftyDollarAmount() == null || drawer.getFinancialDocumentFiftyDollarAmount().isLessThan(detail.getFinancialDocumentFiftyDollarAmount())) {
653                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "fifty dollar amount", formatter.format(detail.getFinancialDocumentFiftyDollarAmount()).toString(), formatter.format(drawer.getFinancialDocumentFiftyDollarAmount()).toString() });
654                     success = false;
655                 }
656             }
657             if (detail.getFinancialDocumentTwentyDollarAmount() != null && detail.getFinancialDocumentTwentyDollarAmount().isGreaterThan(KualiDecimal.ZERO)) {
658                 if (drawer.getFinancialDocumentTwentyDollarAmount() == null || drawer.getFinancialDocumentTwentyDollarAmount().isLessThan(detail.getFinancialDocumentTwentyDollarAmount())) {
659                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "twenty dollar amount", formatter.format(detail.getFinancialDocumentTwentyDollarAmount()).toString(), formatter.format(drawer.getFinancialDocumentTwentyDollarAmount()).toString() });
660                     success = false;
661                 }
662             }
663             if (detail.getFinancialDocumentTenDollarAmount() != null && detail.getFinancialDocumentTenDollarAmount().isGreaterThan(KualiDecimal.ZERO)) {
664                 if (drawer.getFinancialDocumentTenDollarAmount() == null || drawer.getFinancialDocumentTenDollarAmount().isLessThan(detail.getFinancialDocumentTenDollarAmount())) {
665                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "ten dollar amount", formatter.format(detail.getFinancialDocumentTenDollarAmount()).toString(), formatter.format(drawer.getFinancialDocumentTenDollarAmount()).toString() });
666                     success = false;
667                 }
668             }
669             if (detail.getFinancialDocumentFiveDollarAmount() != null && detail.getFinancialDocumentFiveDollarAmount().isGreaterThan(KualiDecimal.ZERO)) {
670                 if (drawer.getFinancialDocumentFiveDollarAmount() == null || drawer.getFinancialDocumentFiveDollarAmount().isLessThan(detail.getFinancialDocumentFiveDollarAmount())) {
671                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "five dollar amount", formatter.format(detail.getFinancialDocumentFiveDollarAmount()).toString(), formatter.format(drawer.getFinancialDocumentFiveDollarAmount()).toString() });
672                     success = false;
673                 }
674             }
675             if (detail.getFinancialDocumentTwoDollarAmount() != null && detail.getFinancialDocumentTwoDollarAmount().isGreaterThan(KualiDecimal.ZERO)) {
676                 if (drawer.getFinancialDocumentTwoDollarAmount() == null || drawer.getFinancialDocumentTwoDollarAmount().isLessThan(detail.getFinancialDocumentTwoDollarAmount())) {
677                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "two dollar amount", formatter.format(detail.getFinancialDocumentTwoDollarAmount()).toString(), formatter.format(drawer.getFinancialDocumentTwoDollarAmount()).toString() });
678                     success = false;
679                 }
680             }
681             if (detail.getFinancialDocumentOneDollarAmount() != null && detail.getFinancialDocumentOneDollarAmount().isGreaterThan(KualiDecimal.ZERO)) {
682                 if (drawer.getFinancialDocumentOneDollarAmount() == null || drawer.getFinancialDocumentOneDollarAmount().isLessThan(detail.getFinancialDocumentOneDollarAmount())) {
683                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "one dollar amount", formatter.format(detail.getFinancialDocumentOneDollarAmount()).toString(), formatter.format(drawer.getFinancialDocumentOneDollarAmount()).toString() });
684                     success = false;
685                 }
686             }
687             if (detail.getFinancialDocumentOtherDollarAmount() != null && detail.getFinancialDocumentOtherDollarAmount().isGreaterThan(KualiDecimal.ZERO)) {
688                 if (drawer.getFinancialDocumentOtherDollarAmount() == null || drawer.getFinancialDocumentOtherDollarAmount().isLessThan(detail.getFinancialDocumentOtherDollarAmount())) {
689                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "other dollar amount", formatter.format(detail.getFinancialDocumentOtherDollarAmount()).toString(), formatter.format(drawer.getFinancialDocumentOtherDollarAmount()).toString() });
690                     success = false;
691                 }
692             }
693         }
694         return success;
695     }
696 
697     /**
698      * Checks that the coin amount requested by the deposit does not exceed the amount actually in the drawer
699      *
700      * @param depositForm the deposit form we are checking against
701      * @param detail the coin detail to check against the drawer
702      * @return true if there is enough coin, false if otherwise
703      */
704     public boolean checkEnoughCoinForDeposit(DepositWizardForm depositForm) {
705         boolean success = true;
706         CoinDetail detail = depositForm.getCoinDetail();
707         if (detail != null) {
708             // 1. get the cash drawer
709             CashDrawer drawer = SpringContext.getBean(CashDrawerService.class).getByCampusCode(depositForm.getCashDrawerCampusCode());
710             // assumptions at this point:
711             // 1. a cash drawer does exist for the unit
712             // 2. we can ignore negative amounts, because if we have negative amounts, we're actually gaining money (and that will
713             // happen with cashiering checks)
714             CurrencyFormatter formatter = new CurrencyFormatter();
715             if (detail.getFinancialDocumentHundredCentAmount() != null && detail.getFinancialDocumentHundredCentAmount().isGreaterThan(KualiDecimal.ZERO)) {
716                 if (drawer.getFinancialDocumentHundredCentAmount() == null || drawer.getFinancialDocumentHundredCentAmount().isLessThan(detail.getFinancialDocumentHundredCentAmount())) {
717                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "hundred cent amount", formatter.format(detail.getFinancialDocumentHundredCentAmount()).toString(), formatter.format(drawer.getFinancialDocumentHundredCentAmount()).toString() });
718                     success = false;
719                 }
720             }
721             if (detail.getFinancialDocumentFiftyCentAmount() != null && detail.getFinancialDocumentFiftyCentAmount().isGreaterThan(KualiDecimal.ZERO)) {
722                 if (drawer.getFinancialDocumentFiftyCentAmount() == null || drawer.getFinancialDocumentFiftyCentAmount().isLessThan(detail.getFinancialDocumentFiftyCentAmount())) {
723                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "fifty cent amount", formatter.format(detail.getFinancialDocumentFiftyCentAmount()).toString(), formatter.format(drawer.getFinancialDocumentFiftyCentAmount()).toString() });
724                     success = false;
725                 }
726             }
727             if (detail.getFinancialDocumentTwentyFiveCentAmount() != null && detail.getFinancialDocumentTwentyFiveCentAmount().isGreaterThan(KualiDecimal.ZERO)) {
728                 if (drawer.getFinancialDocumentTwentyFiveCentAmount() == null || drawer.getFinancialDocumentTwentyFiveCentAmount().isLessThan(detail.getFinancialDocumentTwentyFiveCentAmount())) {
729                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "twenty five cent amount", formatter.format(detail.getFinancialDocumentTwentyFiveCentAmount()).toString(), formatter.format(drawer.getFinancialDocumentTwentyFiveCentAmount()).toString() });
730                     success = false;
731                 }
732             }
733             if (detail.getFinancialDocumentTenCentAmount() != null && detail.getFinancialDocumentTenCentAmount().isGreaterThan(KualiDecimal.ZERO)) {
734                 if (drawer.getFinancialDocumentTenCentAmount() == null || drawer.getFinancialDocumentTenCentAmount().isLessThan(detail.getFinancialDocumentTenCentAmount())) {
735                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "ten cent amount", formatter.format(detail.getFinancialDocumentTenCentAmount()).toString(), formatter.format(drawer.getFinancialDocumentTenCentAmount()).toString() });
736                     success = false;
737                 }
738             }
739             if (detail.getFinancialDocumentFiveCentAmount() != null && detail.getFinancialDocumentFiveCentAmount().isGreaterThan(KualiDecimal.ZERO)) {
740                 if (drawer.getFinancialDocumentFiveCentAmount() == null || drawer.getFinancialDocumentFiveCentAmount().isLessThan(detail.getFinancialDocumentFiveCentAmount())) {
741                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "five cent amount", formatter.format(detail.getFinancialDocumentFiveCentAmount()).toString(), formatter.format(drawer.getFinancialDocumentFiveCentAmount()).toString() });
742                     success = false;
743                 }
744             }
745             if (detail.getFinancialDocumentOneCentAmount() != null && detail.getFinancialDocumentOneCentAmount().isGreaterThan(KualiDecimal.ZERO)) {
746                 if (drawer.getFinancialDocumentOneCentAmount() == null || drawer.getFinancialDocumentOneCentAmount().isLessThan(detail.getFinancialDocumentOneCentAmount())) {
747                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "one cent amount", formatter.format(detail.getFinancialDocumentOneCentAmount()).toString(), formatter.format(drawer.getFinancialDocumentOneCentAmount()).toString() });
748                     success = false;
749                 }
750             }
751             if (detail.getFinancialDocumentOtherCentAmount() != null && detail.getFinancialDocumentOtherCentAmount().isGreaterThan(KualiDecimal.ZERO)) {
752                 if (drawer.getFinancialDocumentOtherCentAmount() == null || drawer.getFinancialDocumentOtherCentAmount().isLessThan(detail.getFinancialDocumentOtherCentAmount())) {
753                     GlobalVariables.getMessageMap().putError(OLEConstants.DepositConstants.DEPOSIT_WIZARD_DEPOSITHEADER_ERROR, OLEKeyConstants.Deposit.ERROR_NOT_ENOUGH_CASH_TO_COMPLETE_DEPOSIT, new String[] { "other cent amount", formatter.format(detail.getFinancialDocumentOtherCentAmount()).toString(), formatter.format(drawer.getFinancialDocumentOtherCentAmount()).toString() });
754                     success = false;
755                 }
756             }
757         }
758         return success;
759     }
760 
761 
762     /**
763      * This method handles canceling (closing) the deposit wizard.
764      *
765      * @param mapping
766      * @param form
767      * @param request
768      * @param response
769      * @return ActionForward
770      * @throws Exception
771      */
772     public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
773         DepositWizardForm dform = (DepositWizardForm) form;
774 
775         ActionForward dest = returnToSender(dform.getCashManagementDocId());
776         return dest;
777     }
778 
779 
780     /**
781      * @param cmDocId
782      * @return ActionForward which will redirect the user to the docSearchDisplay for the CashManagementDocument with the given
783      *         documentId
784      */
785     private ActionForward returnToSender(String cmDocId) {
786         Properties params = new Properties();
787         params.setProperty("methodToCall", "docHandler");
788         params.setProperty("command", "displayDocSearchView");
789         params.setProperty("docId", cmDocId);
790 
791         String cmActionUrl = UrlFactory.parameterizeUrl(OLEConstants.CASH_MANAGEMENT_DOCUMENT_ACTION, params);
792 
793         return new ActionForward(cmActionUrl, true);
794     }
795 }