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.io.Serializable;
19  import java.sql.Timestamp;
20  import java.util.ArrayList;
21  import java.util.HashMap;
22  import java.util.Iterator;
23  import java.util.List;
24  import java.util.Map;
25  
26  import org.apache.log4j.Logger;
27  import org.kuali.ole.fp.businessobject.CashDrawer;
28  import org.kuali.ole.fp.businessobject.CashieringItemInProcess;
29  import org.kuali.ole.fp.businessobject.Check;
30  import org.kuali.ole.fp.businessobject.CheckBase;
31  import org.kuali.ole.fp.businessobject.CoinDetail;
32  import org.kuali.ole.fp.businessobject.CurrencyDetail;
33  import org.kuali.ole.fp.businessobject.Deposit;
34  import org.kuali.ole.fp.businessobject.format.CashDrawerStatusCodeFormatter;
35  import org.kuali.ole.fp.businessobject.format.CashReceiptDepositTypeFormatter;
36  import org.kuali.ole.fp.document.CashManagementDocument;
37  import org.kuali.ole.fp.document.CashReceiptDocument;
38  import org.kuali.ole.fp.document.authorization.CashManagementDocumentPresentationController;
39  import org.kuali.ole.fp.document.service.CashManagementService;
40  import org.kuali.ole.fp.document.service.CashReceiptService;
41  import org.kuali.ole.fp.service.CashDrawerService;
42  import org.kuali.ole.sys.OLEConstants.DepositConstants;
43  import org.kuali.ole.sys.OLEConstants.DocumentStatusCodes.CashReceipt;
44  import org.kuali.ole.sys.context.SpringContext;
45  import org.kuali.ole.sys.document.datadictionary.FinancialSystemTransactionalDocumentEntry;
46  import org.kuali.rice.core.api.datetime.DateTimeService;
47  import org.kuali.rice.core.api.util.type.KualiDecimal;
48  import org.kuali.rice.core.web.format.CurrencyFormatter;
49  import org.kuali.rice.core.web.format.TimestampAMPMFormatter;
50  import org.kuali.rice.kns.service.DataDictionaryService;
51  import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase;
52  
53  /**
54   * This class is the action form for CashManagement
55   */
56  public class CashManagementForm extends KualiDocumentFormBase {
57      protected static final long serialVersionUID = 1L;
58      protected static Logger LOG = Logger.getLogger(CashManagementForm.class);
59  
60      protected static final String CAMPUS_CODE_PROPERTY = "document.campusCode";
61  
62      protected transient List depositHelpers;
63      protected CashDrawerSummary cashDrawerSummary;
64      protected List<CashieringItemInProcess> recentlyClosedItemsInProcess;
65      protected transient CashManagementDocumentPresentationController cmDocPrezController;
66  
67      /**
68       * Constructs a CashManagementForm.
69       */
70      public CashManagementForm() {
71          super();
72  
73          depositHelpers = new ArrayList();
74  
75          setFormatterType("document.cashDrawerStatus", CashDrawerStatusCodeFormatter.class);
76          setFormatterType("document.deposit.depositTypeCode", CashReceiptDepositTypeFormatter.class);
77  
78          setFormatterType("cashDrawerSummary.timeOpened", TimestampAMPMFormatter.class);
79          setFormatterType("cashDrawerSummary.timeRefreshed", TimestampAMPMFormatter.class);
80          setFormatterType("cashDrawerSummary.*Total", CurrencyFormatter.class);
81  
82          setFormatterType("document.currentTransaction.transactionStarted", TimestampAMPMFormatter.class);
83      }
84  
85      @Override
86      protected String getDefaultDocumentTypeName() {
87          return "OLE_CMD";
88      }
89      
90      /**
91       * @return cashManagementDocument
92       */
93      public CashManagementDocument getCashManagementDocument() {
94          return (CashManagementDocument) getDocument();
95      }
96  
97  
98      /**
99       * Creates a DepositHelper foreach Deposit associated with this form's document
100      */
101     public void populateDepositHelpers() {
102         depositHelpers = new ArrayList();
103 
104         List deposits = getCashManagementDocument().getDeposits();
105         for (Iterator i = deposits.iterator(); i.hasNext();) {
106             Deposit d = (Deposit) i.next();
107 
108             DepositHelper dh = new DepositHelper(d);
109             depositHelpers.add(dh);
110         }
111     }
112 
113     /**
114      * Creates and initializes a CashDrawerSummary for the related CashManagementDocument, if it is not currently closed
115      */
116     public void populateCashDrawerSummary() {
117         CashManagementDocument cmd = getCashManagementDocument();
118         if (cmd != null) {
119             CashDrawer cd = SpringContext.getBean(CashDrawerService.class).getByCampusCode(cmd.getCampusCode());
120             if (cd == null) {
121                 throw new RuntimeException("No cash drawer exists for campus code "+cmd.getCampusCode()+"; please create on via the Cash Drawer Maintenance Document before attemping to create a CashManagementDocument for campus "+cmd.getCampusCode());
122             }
123             if (!cd.isClosed()) {
124                 cashDrawerSummary = new CashDrawerSummary(cmd);
125             }
126         }
127     }
128 
129     /**
130      * Tells any JSP page using this form whether an action can be taken to make the last interim deposit the final deposit
131      * 
132      * @return true if last interim deposit could be the final deposit, false if otherwise
133      */
134     public boolean isLastInterimDepositFinalizable() {
135         boolean result = true;
136         CashManagementDocument cmDoc = getCashManagementDocument();
137         result &= !cmDoc.hasFinalDeposit();
138         result &= (cmDoc.getDeposits().size() > 0);
139         if (result) {
140             result &= SpringContext.getBean(CashManagementService.class).allVerifiedCashReceiptsAreDeposited(cmDoc);
141         }
142         return result;
143     }
144 
145     /**
146      * @return CashDrawerSummary instance associated with this form, if any
147      */
148     public CashDrawerSummary getCashDrawerSummary() {
149         return cashDrawerSummary;
150     }
151 
152     /**
153      * Sets the CashDrawerSummary
154      */
155     public void setCashDrawerSummary(CashDrawerSummary cashDrawerSummary) {
156         this.cashDrawerSummary = cashDrawerSummary;
157     }
158 
159     /**
160      * @return List
161      */
162     public List getDepositHelpers() {
163         return depositHelpers;
164     }
165 
166     /**
167      * Gets the recentlyClosedItemsInProcess attribute.
168      * 
169      * @return Returns the recentlyClosedItemsInProcess.
170      */
171     public List<CashieringItemInProcess> getRecentlyClosedItemsInProcess() {
172         return recentlyClosedItemsInProcess;
173     }
174 
175     /**
176      * Sets the recentlyClosedItemsInProcess attribute value.
177      * 
178      * @param recentlyClosedItemsInProcess The recentlyClosedItemsInProcess to set.
179      */
180     public void setRecentlyClosedItemsInProcess(List<CashieringItemInProcess> recentlyClosedItemsInProcess) {
181         this.recentlyClosedItemsInProcess = recentlyClosedItemsInProcess;
182     }
183     
184     /**
185      * @return true if the cash drawer can currently be opened, false otherwise
186      */
187     public boolean getAllowOpenCashDrawer() {
188         if (cmDocPrezController == null) {
189             cmDocPrezController = createCashManagementDocumentPresentationController();
190         }
191         return cmDocPrezController.canOpenCashDrawer(getDocument());
192     }
193     
194     /**
195      * Creates an instance of the appropriate implementation of CashManagementDocumentPresentationController to check the cash drawer opening logic
196      * @return an instance of the CashManagementDocumentPresentationController for the document
197      */
198     protected CashManagementDocumentPresentationController createCashManagementDocumentPresentationController() {
199         final DataDictionaryService dataDictionaryService = SpringContext.getBean(DataDictionaryService.class);
200         final FinancialSystemTransactionalDocumentEntry cmDocEntry = (FinancialSystemTransactionalDocumentEntry)dataDictionaryService.getDataDictionary().getDocumentEntry(dataDictionaryService.getDocumentTypeNameByClass(getDocument().getClass()));
201         
202         final CashManagementDocumentPresentationController cmDocPrezController;
203         try {
204             cmDocPrezController = (CashManagementDocumentPresentationController)cmDocEntry.getDocumentPresentationControllerClass().newInstance();
205         }
206         catch (InstantiationException ie) {
207             throw new RuntimeException("Cannot instantiate instance of document presentation controller with class "+cmDocEntry.getDocumentPresentationControllerClass().getName(), ie);
208         }
209         catch (IllegalAccessException iae) {
210             throw new RuntimeException("Illegal access occurred while instantiating instance of maintainable implementation "+cmDocEntry.getDocumentPresentationControllerClass().getName(), iae);
211         }
212         return cmDocPrezController;
213     }
214 
215     /**
216      * @param i
217      * @return DepositHelper
218      */
219     public DepositHelper getDepositHelper(int i) {
220         while (depositHelpers.size() <= i) {
221             depositHelpers.add(new DepositHelper());
222         }
223         DepositHelper dh = (DepositHelper) depositHelpers.get(i);
224 
225         return dh;
226     }
227 
228     /**
229      * Removes and returns DepositHelper at the given index
230      * 
231      * @param i
232      * @return
233      */
234     public DepositHelper removeDepositHelper(int i) {
235         return (DepositHelper) depositHelpers.remove(i);
236     }
237 
238     /**
239      * Inner helper class.
240      */
241     public static final class DepositHelper {
242         protected Integer depositLineNumber;
243         protected List<CashReceiptSummary> cashReceiptSummarys;
244         protected List<Check> cashieringChecks;
245 
246         /**
247          * Constructs a DepositHelper - default constructor used by PojoProcessor.
248          */
249         public DepositHelper() {
250             cashReceiptSummarys = new ArrayList<CashReceiptSummary>();
251             cashieringChecks = new ArrayList<Check>();
252             depositLineNumber = new Integer(1);
253         }
254 
255         /**
256          * Constructs a DepositHelper
257          * 
258          * @param deposit
259          */
260         public DepositHelper(Deposit deposit) {
261             depositLineNumber = deposit.getFinancialDocumentDepositLineNumber();
262 
263             cashReceiptSummarys = new ArrayList<CashReceiptSummary>();
264 
265             CashManagementService cmService = SpringContext.getBean(CashManagementService.class);
266             List<CashReceiptDocument> cashReceipts = cmService.retrieveCashReceipts(deposit);
267             for (CashReceiptDocument document : cashReceipts) {
268                 cashReceiptSummarys.add(new CashReceiptSummary(document));
269             }
270 
271             cashieringChecks = cmService.selectCashieringChecksForDeposit(deposit.getDocumentNumber(), depositLineNumber);
272         }
273 
274         /**
275          * @return List
276          */
277         public List<CashReceiptSummary> getCashReceiptSummarys() {
278             return cashReceiptSummarys;
279         }
280 
281         /**
282          * @param i
283          * @return CashReceiptSummary
284          */
285         public CashReceiptSummary getCashReceiptSummary(int index) {
286             extendCashReceiptSummarys(index + 1);
287 
288             return cashReceiptSummarys.get(index);
289         }
290 
291         /**
292          * Ensures that there are at least minSize entries in the cashReceiptSummarys list
293          * 
294          * @param minSize
295          */
296         protected void extendCashReceiptSummarys(int minSize) {
297             while (cashReceiptSummarys.size() < minSize) {
298                 cashReceiptSummarys.add(new CashReceiptSummary());
299             }
300         }
301 
302         /**
303          * Gets the cashieringChecks attribute.
304          * 
305          * @return Returns the cashieringChecks.
306          */
307         public List<Check> getCashieringChecks() {
308             return cashieringChecks;
309         }
310 
311         /**
312          * Get a specific cashiering check in the list of cashiering checks
313          * 
314          * @param index the index of the check to retrieve
315          * @return a check
316          */
317         public Check getCashieringCheck(int index) {
318             extendCashieringChecks(index);
319             return cashieringChecks.get(index);
320         }
321 
322         /**
323          * This method makes the cashiering checks list longer, to avoid Array Index out of bounds issues
324          * 
325          * @param minSize the minimum size to make the list
326          */
327         protected void extendCashieringChecks(int minSize) {
328             while (cashieringChecks.size() <= minSize) {
329                 cashieringChecks.add(new CheckBase());
330             }
331         }
332 
333         /**
334          * @return Integer
335          */
336         public Integer getDepositLineNumber() {
337             return depositLineNumber;
338         }
339 
340         /**
341          * @see java.lang.Object#toString()
342          */
343         @Override
344         public String toString() {
345             return "deposit #" + depositLineNumber;
346         }
347     }
348 
349     public static final class CashReceiptSummary {
350         protected String documentNumber;
351         protected String description;
352         protected Timestamp createDate;
353         protected KualiDecimal totalAmount;
354         protected KualiDecimal cashAmount;
355         protected KualiDecimal checkAmount;
356         protected String documentStatusCode;
357 
358         /**
359          * Default constructor used by PojoProcessor.
360          */
361         public CashReceiptSummary() {
362         }
363 
364         /**
365          * Constructs a CashReceiptSummary from the given CashReceiptDocument.
366          * 
367          * @param crd
368          */
369         public CashReceiptSummary(CashReceiptDocument crd) {
370             documentNumber = crd.getDocumentNumber();
371             description = crd.getDocumentHeader().getDocumentDescription();
372             createDate = new Timestamp(crd.getDocumentHeader().getWorkflowDocument().getDateCreated().getMillis());
373             checkAmount = crd.getTotalConfirmedCheckAmount();
374             cashAmount = crd.getTotalConfirmedCashAmount();
375             totalAmount = crd.getTotalConfirmedDollarAmount().subtract(crd.getTotalChangeAmount());
376             documentStatusCode = crd.getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode();
377         }
378 
379         /**
380          * @return current value of createDate.
381          */
382         public Timestamp getCreateDate() {
383             return createDate;
384         }
385 
386         /**
387          * Sets the createDate attribute value.
388          * 
389          * @param createDate The createDate to set.
390          */
391         public void setCreateDate(Timestamp createDate) {
392             this.createDate = createDate;
393         }
394 
395         /**
396          * @return current value of description.
397          */
398         public String getDescription() {
399             return description;
400         }
401 
402         /**
403          * Sets the description attribute value.
404          * 
405          * @param description The description to set.
406          */
407         public void setDescription(String description) {
408             this.description = description;
409         }
410 
411         /**
412          * @return current value of documentNumber.
413          */
414         public String getDocumentNumber() {
415             return documentNumber;
416         }
417 
418         /**
419          * Sets the documentNumber attribute value.
420          * 
421          * @param docNumber The documentNumber to set.
422          */
423         public void setDocumentNumber(String documentNumber) {
424             this.documentNumber = documentNumber;
425         }
426 
427         /**
428          * @return current value of totalAmount.
429          */
430         public KualiDecimal getTotalAmount() {
431             return totalAmount;
432         }
433 
434         /**
435          * Sets the totalAmount attribute value.
436          * 
437          * @param totalAmount The totalAmount to set.
438          */
439         public void setTotalAmount(KualiDecimal totalAmount) {
440             this.totalAmount = totalAmount;
441         }
442 
443         /**
444          * Returns the total check amount for this CR
445          * 
446          * @return a total of checks
447          */
448         public KualiDecimal getCheckAmount() {
449             return this.checkAmount;
450         }
451 
452         /**
453          * Sets the checkAmount attribute value.
454          */
455         public void setCheckAmount(KualiDecimal checkAmount) {
456             this.checkAmount = checkAmount;
457         }
458 
459         /**
460          * @see java.lang.Object#toString()
461          */
462         @Override
463         public String toString() {
464             return "CRSummary " + getDocumentNumber();
465         }
466 
467         /**
468          * @return the cashAmount
469          */
470         public KualiDecimal getCashAmount() {
471             return cashAmount;
472         }
473 
474         /**
475          * @param cashAmount the cashAmount to set
476          */
477         public void setCashAmount(KualiDecimal cashAmount) {
478             this.cashAmount = cashAmount;
479         }
480 
481         /**
482          * @return the documentStatusCode
483          */
484         public String getDocumentStatusCode() {
485             return documentStatusCode;
486         }
487 
488         /**
489          * @param documentStatusCode the documentStatusCode to set
490          */
491         public void setDocumentStatusCode(String documentStatusCode) {
492             this.documentStatusCode = documentStatusCode;
493         }
494         
495     }
496 
497     public static final class CashDrawerSummary implements Serializable {
498         protected Timestamp timeOpened;
499         protected Timestamp timeRefreshed;
500 
501         // directly calculated
502         protected int overallReceiptCount;
503         protected int depositedReceiptCount;
504 
505         protected CashReceiptStatistics verifiedReceiptStats = new CashReceiptStatistics();
506         protected CashReceiptStatistics interimReceiptStats = new CashReceiptStatistics();
507         protected CashReceiptStatistics finalReceiptStats = new CashReceiptStatistics();
508         protected CashReceiptStatistics overallReceiptStats = new CashReceiptStatistics();
509 
510         // derived
511         protected KualiDecimal verifiedReceiptSumTotal;
512         protected KualiDecimal interimReceiptSumTotal;
513         protected KualiDecimal finalReceiptSumTotal;
514         protected KualiDecimal overallReceiptSumTotal;
515 
516         protected KualiDecimal remainingCheckTotal;
517         protected KualiDecimal remainingCurrencyTotal;
518         protected KualiDecimal remainingCoinTotal;
519         protected KualiDecimal remainingSumTotal;
520 
521         protected boolean isDepositsFinal = false;
522         protected KualiDecimal cashieringChecksTotal;
523         protected KualiDecimal depositedCashieringChecksTotal;
524         protected KualiDecimal undepositedCashieringChecksTotal;
525         protected KualiDecimal cashDrawerCurrencyTotal;
526         protected KualiDecimal cashDrawerCoinTotal;
527         protected KualiDecimal openItemsTotal;
528         protected KualiDecimal cashDrawerTotal;
529         protected KualiDecimal interimDepositedCashieringChecksTotal;
530         protected KualiDecimal finalDepositedCashieringChecksTotal;
531 
532         public CashDrawerSummary(CashManagementDocument cmDoc) {
533             timeOpened = new Timestamp(cmDoc.getDocumentHeader().getWorkflowDocument().getDateCreated().getMillis());
534 
535             resummarize(cmDoc);
536         }
537 
538         public CashDrawerSummary() {
539         }
540 
541 
542         protected static final String[] INTERESTING_STATII = { CashReceipt.VERIFIED, CashReceipt.INTERIM, CashReceipt.FINAL };
543 
544         public void resummarize(CashManagementDocument cmDoc) {
545             //
546             // get all interesting CRs
547             String campusCode = cmDoc.getCampusCode(); 
548             List<CashReceiptDocument> interestingReceipts = SpringContext.getBean(CashReceiptService.class).getCashReceipts(campusCode, INTERESTING_STATII);
549 
550 
551             //
552             // rather than separating into lists by status, gather statistics in one fell swoop
553             overallReceiptStats.clear();
554             verifiedReceiptStats.clear();
555             interimReceiptStats.clear();
556             finalReceiptStats.clear();
557 
558             for (CashReceiptDocument receipt : interestingReceipts) {
559                 String status = receipt.getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode();
560                 overallReceiptStats.add(receipt);
561                 if (status.equals(CashReceipt.VERIFIED)) {
562                     verifiedReceiptStats.add(receipt);
563                 }
564                 else if (status.equals(CashReceipt.INTERIM)) {
565                     interimReceiptStats.add(receipt);
566                 }
567                 else if (status.equals(CashReceipt.FINAL)) {
568                     finalReceiptStats.add(receipt);
569                 }
570                 else {
571                     throw new IllegalStateException("invalid (unknown) financialDocumentStatusCode '" + status + "'");
572                 }
573             }
574 
575             overallReceiptCount = overallReceiptStats.getReceiptCount();
576             depositedReceiptCount = interimReceiptStats.getReceiptCount() + finalReceiptStats.getReceiptCount();
577 
578             // get cash drawer summary info
579             depositedCashieringChecksTotal = calculateDepositedCashieringChecksTotal(cmDoc);
580             undepositedCashieringChecksTotal = calculateUndepositedCashieringChecksTotal(cmDoc);
581             cashieringChecksTotal = depositedCashieringChecksTotal.add(undepositedCashieringChecksTotal);
582             openItemsTotal = calculateOpenItemsTotal(cmDoc);
583             cashDrawerCurrencyTotal = cmDoc.getCashDrawer().getCurrencyTotalAmount();
584             cashDrawerCoinTotal = cmDoc.getCashDrawer().getCoinTotalAmount();
585             cashDrawerTotal = undepositedCashieringChecksTotal.add(openItemsTotal.add(cashDrawerCurrencyTotal.add(cashDrawerCoinTotal)));
586             Map<String, KualiDecimal> results = calculateDepositedCashieringChecksTotalByDepositType(cmDoc);
587             interimDepositedCashieringChecksTotal = results.get(DepositConstants.DEPOSIT_TYPE_INTERIM);
588             KualiDecimal finalDepositCashTotal = KualiDecimal.ZERO;
589             Map<Class, Object> finalDepositCashDetails = SpringContext.getBean(CashManagementService.class).getCashDetailsForFinalDeposit(cmDoc.getDocumentNumber());
590             KualiDecimal currencyDepositAmount = KualiDecimal.ZERO;
591             if (finalDepositCashDetails.get(CurrencyDetail.class) != null) {
592                 currencyDepositAmount = ((CurrencyDetail) finalDepositCashDetails.get(CurrencyDetail.class)).getTotalAmount();
593             }
594             KualiDecimal coinDepositAmount = KualiDecimal.ZERO;
595             if (finalDepositCashDetails.get(CoinDetail.class) != null) {
596                 coinDepositAmount = ((CoinDetail) finalDepositCashDetails.get(CoinDetail.class)).getTotalAmount();
597             }
598             finalDepositCashTotal = finalDepositCashTotal.add(currencyDepositAmount).add(coinDepositAmount);
599             finalDepositedCashieringChecksTotal = results.get(DepositConstants.DEPOSIT_TYPE_FINAL).add(finalDepositCashTotal);
600 
601 
602             verifiedReceiptSumTotal = verifiedReceiptStats.getSumTotal();
603             interimReceiptSumTotal = interimReceiptStats.getCheckTotal().add(interimDepositedCashieringChecksTotal);
604             finalReceiptSumTotal = finalReceiptStats.getCheckTotal().add(finalDepositedCashieringChecksTotal);
605             overallReceiptSumTotal = overallReceiptStats.getSumTotal();
606 
607             remainingCheckTotal = overallReceiptStats.getCheckTotal().subtract(interimReceiptStats.getCheckTotal()).subtract(finalReceiptStats.getCheckTotal());
608             remainingCurrencyTotal = overallReceiptStats.getCurrencyTotal().subtract(currencyDepositAmount).subtract(depositedCashieringChecksTotal);
609             remainingCoinTotal = overallReceiptStats.getCoinTotal().subtract(coinDepositAmount);
610             remainingSumTotal = remainingCheckTotal.add(remainingCurrencyTotal.add(remainingCoinTotal));
611 
612             isDepositsFinal = cmDoc.hasFinalDeposit();
613 
614             timeRefreshed = SpringContext.getBean(DateTimeService.class).getCurrentTimestamp();
615         }
616 
617         protected KualiDecimal calculateDepositedCashieringChecksTotal(CashManagementDocument cmDoc) {
618             return SpringContext.getBean(CashManagementService.class).calculateDepositedCheckTotal(cmDoc.getDocumentNumber());
619         }
620 
621         protected KualiDecimal calculateUndepositedCashieringChecksTotal(CashManagementDocument cmDoc) {
622             return SpringContext.getBean(CashManagementService.class).calculateUndepositedCheckTotal(cmDoc.getDocumentNumber());
623         }
624 
625         protected KualiDecimal calculateOpenItemsTotal(CashManagementDocument cmDoc) {
626             KualiDecimal total = KualiDecimal.ZERO;
627             for (CashieringItemInProcess itemInProcess : SpringContext.getBean(CashManagementService.class).getOpenItemsInProcess(cmDoc)) {
628                 if (itemInProcess.getItemRemainingAmount() != null) {
629                     total = total.add(itemInProcess.getItemRemainingAmount());
630                 }
631             }
632             return total;
633         }
634 
635         protected Map<String, KualiDecimal> calculateDepositedCashieringChecksTotalByDepositType(CashManagementDocument cmDoc) {
636             Map<String, KualiDecimal> result = new HashMap<String, KualiDecimal>();
637             result.put(DepositConstants.DEPOSIT_TYPE_INTERIM, KualiDecimal.ZERO);
638             result.put(DepositConstants.DEPOSIT_TYPE_FINAL, KualiDecimal.ZERO);
639             // 1. get all deposited cashiering checks
640             List<Check> checks = SpringContext.getBean(CashManagementService.class).selectDepositedCashieringChecks(cmDoc.getDocumentNumber());
641             // 2. get all deposits
642             List<Deposit> deposits = cmDoc.getDeposits();
643             Map<Integer, String> depositTypes = new HashMap<Integer, String>();
644             for (Deposit deposit : deposits) {
645                 depositTypes.put(deposit.getFinancialDocumentDepositLineNumber(), deposit.getDepositTypeCode());
646             }
647             // 3. now, go through all cashiering checks, totalling them to the right deposit type
648             for (Check check : checks) {
649                 KualiDecimal properTotal = result.get(depositTypes.get(check.getFinancialDocumentDepositLineNumber()));
650                 properTotal = properTotal.add(check.getAmount());
651                 result.put(depositTypes.get(check.getFinancialDocumentDepositLineNumber()), properTotal);
652             }
653             return result;
654         }
655 
656         /**
657          * @return current value of depositedReceiptCount.
658          */
659         public int getDepositedReceiptCount() {
660             return depositedReceiptCount;
661         }
662 
663         /**
664          * Sets the depositedReceiptCount attribute value.
665          * 
666          * @param depositedReceiptCount The depositedReceiptCount to set.
667          */
668         public void setDepositedReceiptCount(int depositedReceiptCount) {
669             this.depositedReceiptCount = depositedReceiptCount;
670         }
671 
672 
673         /**
674          * @return current value of finalReceiptSumTotal.
675          */
676         public KualiDecimal getFinalReceiptSumTotal() {
677             return finalReceiptSumTotal;
678         }
679 
680         /**
681          * Sets the finalReceiptSumTotal attribute value.
682          * 
683          * @param finalReceiptSumTotal The finalReceiptSumTotal to set.
684          */
685         public void setFinalReceiptSumTotal(KualiDecimal finalSumTotal) {
686             this.finalReceiptSumTotal = finalSumTotal;
687         }
688 
689 
690         /**
691          * @return current value of interimReceiptSumTotal.
692          */
693         public KualiDecimal getInterimReceiptSumTotal() {
694             return interimReceiptSumTotal;
695         }
696 
697         /**
698          * Sets the interimReceiptSumTotal attribute value.
699          * 
700          * @param interimReceiptSumTotal The interimReceiptSumTotal to set.
701          */
702         public void setInterimReceiptSumTotal(KualiDecimal interimSumTotal) {
703             this.interimReceiptSumTotal = interimSumTotal;
704         }
705 
706 
707         /**
708          * @return current value of overallReceiptCount.
709          */
710         public int getOverallReceiptCount() {
711             return overallReceiptCount;
712         }
713 
714         /**
715          * Sets the overallReceiptCount attribute value.
716          * 
717          * @param overallReceiptCount The overallReceiptCount to set.
718          */
719         public void setOverallReceiptCount(int overallReceiptCount) {
720             this.overallReceiptCount = overallReceiptCount;
721         }
722 
723 
724         /**
725          * @return current value of remainingCheckTotal.
726          */
727         public KualiDecimal getRemainingCheckTotal() {
728             return remainingCheckTotal;
729         }
730 
731         /**
732          * Sets the remainingCheckTotal attribute value.
733          * 
734          * @param remainingCheckTotal The remainingCheckTotal to set.
735          */
736         public void setRemainingCheckTotal(KualiDecimal remainingCheckTotal) {
737             this.remainingCheckTotal = remainingCheckTotal;
738         }
739 
740 
741         /**
742          * @return current value of remainingCoinTotal.
743          */
744         public KualiDecimal getRemainingCoinTotal() {
745             return remainingCoinTotal;
746         }
747 
748         /**
749          * Sets the remainingCoinTotal attribute value.
750          * 
751          * @param remainingCoinTotal The remainingCoinTotal to set.
752          */
753         public void setRemainingCoinTotal(KualiDecimal remainingCoinTotal) {
754             this.remainingCoinTotal = remainingCoinTotal;
755         }
756 
757         /**
758          * @return current value of remainingCurrencyTotal.
759          */
760         public KualiDecimal getRemainingCurrencyTotal() {
761             return remainingCurrencyTotal;
762         }
763 
764         /**
765          * Sets the remainingCurrencyTotal attribute value.
766          * 
767          * @param remainingCurrencyTotal The remainingCurrencyTotal to set.
768          */
769         public void setRemainingCurrencyTotal(KualiDecimal remainingCurrencyTotal) {
770             this.remainingCurrencyTotal = remainingCurrencyTotal;
771         }
772 
773 
774         /**
775          * @return current value of remainingSumTotal.
776          */
777         public KualiDecimal getRemainingSumTotal() {
778             return remainingSumTotal;
779         }
780 
781         /**
782          * Sets the remainingSumTotal attribute value.
783          * 
784          * @param remainingSumTotal The remainingSumTotal to set.
785          */
786         public void setRemainingSumTotal(KualiDecimal remainingSumTotal) {
787             this.remainingSumTotal = remainingSumTotal;
788         }
789 
790 
791         /**
792          * @return current value of timeOpened.
793          */
794         public Timestamp getTimeOpened() {
795             return timeOpened;
796         }
797 
798         /**
799          * Sets the timeOpened attribute value.
800          * 
801          * @param timeOpened The timeOpened to set.
802          */
803         public void setTimeOpened(Timestamp timeOpened) {
804             this.timeOpened = timeOpened;
805         }
806 
807 
808         /**
809          * @return current value of timeRefreshed.
810          */
811         public Timestamp getTimeRefreshed() {
812             return timeRefreshed;
813         }
814 
815         /**
816          * Sets the timeRefreshed attribute value.
817          * 
818          * @param timeRefreshed The timeRefreshed to set.
819          */
820         public void setTimeRefreshed(Timestamp timeRefreshed) {
821             this.timeRefreshed = timeRefreshed;
822         }
823 
824 
825         /**
826          * @return current value of verifiedReceiptSumTotal.
827          */
828         public KualiDecimal getVerifiedReceiptSumTotal() {
829             return verifiedReceiptSumTotal;
830         }
831 
832         /**
833          * Sets the verifiedReceiptSumTotal attribute value.
834          * 
835          * @param verifiedReceiptSumTotal The verifiedReceiptSumTotal to set.
836          */
837         public void setVerifiedReceiptSumTotal(KualiDecimal verifiedSumTotal) {
838             this.verifiedReceiptSumTotal = verifiedSumTotal;
839         }
840 
841 
842         /**
843          * @return current value of overallReceiptSumTotal.
844          */
845         public KualiDecimal getOverallReceiptSumTotal() {
846             return overallReceiptSumTotal;
847         }
848 
849         /**
850          * Sets the overallReceiptSumTotal attribute value.
851          * 
852          * @param overallReceiptSumTotal The overallReceiptSumTotal to set.
853          */
854         public void setOverallReceiptSumTotal(KualiDecimal overallSumTotal) {
855             this.overallReceiptSumTotal = overallSumTotal;
856         }
857 
858 
859         /**
860          * @return current value of finalReceiptStats.
861          */
862         public CashReceiptStatistics getFinalReceiptStats() {
863             return finalReceiptStats;
864         }
865 
866         /**
867          * @return current value of interimReceiptStats.
868          */
869         public CashReceiptStatistics getInterimReceiptStats() {
870             return interimReceiptStats;
871         }
872 
873         /**
874          * @return current value of verifiedReceiptStats.
875          */
876         public CashReceiptStatistics getVerifiedReceiptStats() {
877             return verifiedReceiptStats;
878         }
879 
880         /**
881          * Gets the cashDrawerCoinTotal attribute.
882          * 
883          * @return Returns the cashDrawerCoinTotal.
884          */
885         public KualiDecimal getCashDrawerCoinTotal() {
886             return cashDrawerCoinTotal;
887         }
888 
889         /**
890          * Gets the cashDrawerCurrencyTotal attribute.
891          * 
892          * @return Returns the cashDrawerCurrencyTotal.
893          */
894         public KualiDecimal getCashDrawerCurrencyTotal() {
895             return cashDrawerCurrencyTotal;
896         }
897 
898         /**
899          * Gets the cashDrawerTotal attribute.
900          * 
901          * @return Returns the cashDrawerTotal.
902          */
903         public KualiDecimal getCashDrawerTotal() {
904             return cashDrawerTotal;
905         }
906 
907         /**
908          * Gets the cashieringChecksTotal attribute.
909          * 
910          * @return Returns the cashieringChecksTotal.
911          */
912         public KualiDecimal getCashieringChecksTotal() {
913             return cashieringChecksTotal;
914         }
915 
916         /**
917          * Sets the cashieringChecksTotal attribute value.
918          * 
919          * @param cashieringChecksTotal The cashieringChecksTotal to set.
920          */
921         public void setCashieringChecksTotal(KualiDecimal cashieringChecksTotal) {
922             this.cashieringChecksTotal = cashieringChecksTotal;
923         }
924 
925         /**
926          * Sets the depositedCashieringChecksTotal attribute value.
927          * 
928          * @param depositedCashieringChecksTotal The depositedCashieringChecksTotal to set.
929          */
930         public void setDepositedCashieringChecksTotal(KualiDecimal depositedCashieringChecksTotal) {
931             this.depositedCashieringChecksTotal = depositedCashieringChecksTotal;
932         }
933 
934         /**
935          * Gets the isDepositsFinal attribute.
936          * 
937          * @return Returns the isDepositsFinal.
938          */
939         public boolean isDepositsFinal() {
940             return isDepositsFinal;
941         }
942 
943         /**
944          * Sets the cashDrawerCoinTotal attribute value.
945          * 
946          * @param cashDrawerCoinTotal The cashDrawerCoinTotal to set.
947          */
948         public void setCashDrawerCoinTotal(KualiDecimal cashDrawerCoinTotal) {
949             this.cashDrawerCoinTotal = cashDrawerCoinTotal;
950         }
951 
952         /**
953          * Sets the cashDrawerCurrencyTotal attribute value.
954          * 
955          * @param cashDrawerCurrencyTotal The cashDrawerCurrencyTotal to set.
956          */
957         public void setCashDrawerCurrencyTotal(KualiDecimal cashDrawerCurrencyTotal) {
958             this.cashDrawerCurrencyTotal = cashDrawerCurrencyTotal;
959         }
960 
961         /**
962          * Sets the cashDrawerTotal attribute value.
963          * 
964          * @param cashDrawerTotal The cashDrawerTotal to set.
965          */
966         public void setCashDrawerTotal(KualiDecimal cashDrawerTotal) {
967             this.cashDrawerTotal = cashDrawerTotal;
968         }
969 
970         /**
971          * Sets the openItemsTotal attribute value.
972          * 
973          * @param openItemsTotal The openItemsTotal to set.
974          */
975         public void setOpenItemsTotal(KualiDecimal openItemsTotal) {
976             this.openItemsTotal = openItemsTotal;
977         }
978 
979         /**
980          * Sets the undepositedCashieringChecksTotal attribute value.
981          * 
982          * @param undepositedCashieringChecksTotal The undepositedCashieringChecksTotal to set.
983          */
984         public void setUndepositedCashieringChecksTotal(KualiDecimal undepositedCashieringChecksTotal) {
985             this.undepositedCashieringChecksTotal = undepositedCashieringChecksTotal;
986         }
987 
988         /**
989          * Gets the openItemsTotal attribute.
990          * 
991          * @return Returns the openItemsTotal.
992          */
993         public KualiDecimal getOpenItemsTotal() {
994             return openItemsTotal;
995         }
996 
997         /**
998          * Gets the depositedCashieringChecksTotal attribute.
999          * 
1000          * @return Returns the depositedCashieringChecksTotal.
1001          */
1002         public KualiDecimal getDepositedCashieringChecksTotal() {
1003             return depositedCashieringChecksTotal;
1004         }
1005 
1006         /**
1007          * Gets the undepositedCashieringChecksTotal attribute.
1008          * 
1009          * @return Returns the undepositedCashieringChecksTotal.
1010          */
1011         public KualiDecimal getUndepositedCashieringChecksTotal() {
1012             return undepositedCashieringChecksTotal;
1013         }
1014 
1015         /**
1016          * @return current value of overalllStats.
1017          */
1018         public CashReceiptStatistics getOverallReceiptStats() {
1019             return overallReceiptStats;
1020         }
1021 
1022         public static final class CashReceiptStatistics implements Serializable{
1023             protected int receiptCount;
1024             protected KualiDecimal checkTotal;
1025             protected KualiDecimal currencyTotal;
1026             protected KualiDecimal coinTotal;
1027 
1028             /**
1029              * Constructs a SubSummary.
1030              */
1031             public CashReceiptStatistics() {
1032                 clear();
1033             }
1034 
1035             /**
1036              * Increments the counter by 1, and the various totals by the amounts in the given CashReceiptDocument
1037              * 
1038              * @param receipt
1039              */
1040             public void add(CashReceiptDocument receipt) {
1041                 receipt.refreshCashDetails();
1042                 receiptCount++;
1043                 checkTotal = checkTotal.add(receipt.getTotalConfirmedCheckAmount());
1044                 currencyTotal = currencyTotal.add(receipt.getTotalConfirmedCashAmount()).subtract(receipt.getTotalChangeCashAmount());
1045                 coinTotal = coinTotal.add(receipt.getTotalConfirmedCoinAmount()).subtract(receipt.getTotalChangeCoinAmount());
1046             }
1047 
1048             /**
1049              * Zeros counter and totals.
1050              */
1051             public void clear() {
1052                 receiptCount = 0;
1053                 checkTotal = KualiDecimal.ZERO;
1054                 currencyTotal = KualiDecimal.ZERO;
1055                 coinTotal = KualiDecimal.ZERO;
1056             }
1057 
1058 
1059             /**
1060              * Returns total of all check, coin, and currency totals
1061              */
1062             public KualiDecimal getSumTotal() {
1063                 KualiDecimal sumTotal = getCheckTotal().add(getCoinTotal().add(getCurrencyTotal()));
1064 
1065                 return sumTotal;
1066             }
1067 
1068             /**
1069              * This method doesn't do anything but appease the demands of POJO form population...I mean...er...this sets the sum
1070              * total, now doesn't it?
1071              * 
1072              * @param total total you want this method to ignore
1073              */
1074             public void setSumTotal(KualiDecimal total) {
1075                 // don't do anything. just be very quiet and maybe the POJO loader will be satisfied
1076             }
1077 
1078 
1079             /**
1080              * @return current value of checkTotal.
1081              */
1082             public KualiDecimal getCheckTotal() {
1083                 return checkTotal;
1084             }
1085 
1086             /**
1087              * Sets the checkTotal attribute value.
1088              * 
1089              * @param checkTotal The checkTotal to set.
1090              */
1091             public void setCheckTotal(KualiDecimal checkTotal) {
1092                 this.checkTotal = checkTotal;
1093             }
1094 
1095 
1096             /**
1097              * @return current value of coinTotal.
1098              */
1099             public KualiDecimal getCoinTotal() {
1100                 return coinTotal;
1101             }
1102 
1103             /**
1104              * Sets the coinTotal attribute value.
1105              * 
1106              * @param coinTotal The coinTotal to set.
1107              */
1108             public void setCoinTotal(KualiDecimal coinTotal) {
1109                 this.coinTotal = coinTotal;
1110             }
1111 
1112 
1113             /**
1114              * @return current value of currencyTotal.
1115              */
1116             public KualiDecimal getCurrencyTotal() {
1117                 return currencyTotal;
1118             }
1119 
1120             /**
1121              * Sets the currencyTotal attribute value.
1122              * 
1123              * @param currencyTotal The currencyTotal to set.
1124              */
1125             public void setCurrencyTotal(KualiDecimal currencyTotal) {
1126                 this.currencyTotal = currencyTotal;
1127             }
1128 
1129 
1130             /**
1131              * @return current value of receiptCount.
1132              */
1133             public int getReceiptCount() {
1134                 return receiptCount;
1135             }
1136 
1137             /**
1138              * Sets the receiptCount attribute value.
1139              * 
1140              * @param receiptCount The receiptCount to set.
1141              */
1142             public void setReceiptCount(int receiptCount) {
1143                 this.receiptCount = receiptCount;
1144             }
1145 
1146 
1147             /**
1148              * @see java.lang.Object#toString()
1149              */
1150             @Override
1151             public String toString() {
1152                 return "CashDrawerSummary(" + getSumTotal() + " = " + getCheckTotal() + " + " + getCurrencyTotal() + " + " + getCoinTotal() + ")";
1153             }
1154         }
1155     }
1156 
1157     /**
1158      * @see org.kuali.rice.kns.web.struts.pojo.PojoFormBase#postprocessRequestParameters(java.util.Map)
1159      */
1160     @Override
1161     public void postprocessRequestParameters(Map requestParameters) {
1162         super.postprocessRequestParameters(requestParameters);
1163         // fish the campus code name out of the parameters
1164         String[] campusCodes = (String[]) requestParameters.get(CashManagementForm.CAMPUS_CODE_PROPERTY);
1165         String campusCode = null;
1166         if (campusCodes != null && campusCodes.length > 0) {
1167             campusCode = campusCodes[0];
1168         }
1169         if (campusCode != null && getCashManagementDocument() != null) {
1170             // use that to put the cash drawer back into the cash management document
1171             getCashManagementDocument().setCashDrawer(SpringContext.getBean(CashDrawerService.class).getByCampusCode(campusCode));
1172         }
1173     }
1174 
1175 
1176 }