001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.fp.document.web.struts; 017 018 import java.io.Serializable; 019 import java.sql.Timestamp; 020 import java.util.ArrayList; 021 import java.util.HashMap; 022 import java.util.Iterator; 023 import java.util.List; 024 import java.util.Map; 025 026 import org.apache.log4j.Logger; 027 import org.kuali.kfs.fp.businessobject.CashDrawer; 028 import org.kuali.kfs.fp.businessobject.CashieringItemInProcess; 029 import org.kuali.kfs.fp.businessobject.Check; 030 import org.kuali.kfs.fp.businessobject.CheckBase; 031 import org.kuali.kfs.fp.businessobject.CoinDetail; 032 import org.kuali.kfs.fp.businessobject.CurrencyDetail; 033 import org.kuali.kfs.fp.businessobject.Deposit; 034 import org.kuali.kfs.fp.businessobject.format.CashDrawerStatusCodeFormatter; 035 import org.kuali.kfs.fp.businessobject.format.CashReceiptDepositTypeFormatter; 036 import org.kuali.kfs.fp.document.CashManagementDocument; 037 import org.kuali.kfs.fp.document.CashReceiptDocument; 038 import org.kuali.kfs.fp.document.authorization.CashManagementDocumentPresentationController; 039 import org.kuali.kfs.fp.document.service.CashManagementService; 040 import org.kuali.kfs.fp.document.service.CashReceiptService; 041 import org.kuali.kfs.fp.service.CashDrawerService; 042 import org.kuali.kfs.sys.KFSConstants.DepositConstants; 043 import org.kuali.kfs.sys.KFSConstants.DocumentStatusCodes.CashReceipt; 044 import org.kuali.kfs.sys.context.SpringContext; 045 import org.kuali.kfs.sys.document.datadictionary.FinancialSystemTransactionalDocumentEntry; 046 import org.kuali.rice.kns.service.DataDictionaryService; 047 import org.kuali.rice.kns.service.DateTimeService; 048 import org.kuali.rice.kns.util.KualiDecimal; 049 import org.kuali.rice.kns.web.format.CurrencyFormatter; 050 import org.kuali.rice.kns.web.format.TimestampAMPMFormatter; 051 import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; 052 053 /** 054 * This class is the action form for CashManagement 055 */ 056 public class CashManagementForm extends KualiDocumentFormBase { 057 protected static final long serialVersionUID = 1L; 058 protected static Logger LOG = Logger.getLogger(CashManagementForm.class); 059 060 protected static final String CAMPUS_CODE_PROPERTY = "document.campusCode"; 061 062 protected transient List depositHelpers; 063 protected CashDrawerSummary cashDrawerSummary; 064 protected List<CashieringItemInProcess> recentlyClosedItemsInProcess; 065 protected transient CashManagementDocumentPresentationController cmDocPrezController; 066 067 /** 068 * Constructs a CashManagementForm. 069 */ 070 public CashManagementForm() { 071 super(); 072 073 depositHelpers = new ArrayList(); 074 075 setFormatterType("document.cashDrawerStatus", CashDrawerStatusCodeFormatter.class); 076 setFormatterType("document.deposit.depositTypeCode", CashReceiptDepositTypeFormatter.class); 077 078 setFormatterType("cashDrawerSummary.timeOpened", TimestampAMPMFormatter.class); 079 setFormatterType("cashDrawerSummary.timeRefreshed", TimestampAMPMFormatter.class); 080 setFormatterType("cashDrawerSummary.*Total", CurrencyFormatter.class); 081 082 setFormatterType("document.currentTransaction.transactionStarted", TimestampAMPMFormatter.class); 083 } 084 085 @Override 086 protected String getDefaultDocumentTypeName() { 087 return "CMD"; 088 } 089 090 /** 091 * @return cashManagementDocument 092 */ 093 public CashManagementDocument getCashManagementDocument() { 094 return (CashManagementDocument) getDocument(); 095 } 096 097 098 /** 099 * 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 checkAmount; 355 356 /** 357 * Default constructor used by PojoProcessor. 358 */ 359 public CashReceiptSummary() { 360 } 361 362 /** 363 * Constructs a CashReceiptSummary from the given CashReceiptDocument. 364 * 365 * @param crd 366 */ 367 public CashReceiptSummary(CashReceiptDocument crd) { 368 documentNumber = crd.getDocumentNumber(); 369 description = crd.getDocumentHeader().getDocumentDescription(); 370 createDate = crd.getDocumentHeader().getWorkflowDocument().getCreateDate(); 371 checkAmount = crd.getTotalCheckAmount(); 372 totalAmount = crd.getTotalDollarAmount(); 373 } 374 375 /** 376 * @return current value of createDate. 377 */ 378 public Timestamp getCreateDate() { 379 return createDate; 380 } 381 382 /** 383 * Sets the createDate attribute value. 384 * 385 * @param createDate The createDate to set. 386 */ 387 public void setCreateDate(Timestamp createDate) { 388 this.createDate = createDate; 389 } 390 391 /** 392 * @return current value of description. 393 */ 394 public String getDescription() { 395 return description; 396 } 397 398 /** 399 * Sets the description attribute value. 400 * 401 * @param description The description to set. 402 */ 403 public void setDescription(String description) { 404 this.description = description; 405 } 406 407 /** 408 * @return current value of documentNumber. 409 */ 410 public String getDocumentNumber() { 411 return documentNumber; 412 } 413 414 /** 415 * Sets the documentNumber attribute value. 416 * 417 * @param docNumber The documentNumber to set. 418 */ 419 public void setDocumentNumber(String documentNumber) { 420 this.documentNumber = documentNumber; 421 } 422 423 /** 424 * @return current value of totalAmount. 425 */ 426 public KualiDecimal getTotalAmount() { 427 return totalAmount; 428 } 429 430 /** 431 * Sets the totalAmount attribute value. 432 * 433 * @param totalAmount The totalAmount to set. 434 */ 435 public void setTotalAmount(KualiDecimal totalAmount) { 436 this.totalAmount = totalAmount; 437 } 438 439 /** 440 * Returns the total check amount for this CR 441 * 442 * @return a total of checks 443 */ 444 public KualiDecimal getCheckAmount() { 445 return this.checkAmount; 446 } 447 448 /** 449 * Sets the checkAmount attribute value. 450 */ 451 public void setCheckAmount(KualiDecimal checkAmount) { 452 this.checkAmount = checkAmount; 453 } 454 455 /** 456 * @see java.lang.Object#toString() 457 */ 458 @Override 459 public String toString() { 460 return "CRSummary " + getDocumentNumber(); 461 } 462 } 463 464 public static final class CashDrawerSummary implements Serializable { 465 protected Timestamp timeOpened; 466 protected Timestamp timeRefreshed; 467 468 // directly calculated 469 protected int overallReceiptCount; 470 protected int depositedReceiptCount; 471 472 protected CashReceiptStatistics verifiedReceiptStats = new CashReceiptStatistics(); 473 protected CashReceiptStatistics interimReceiptStats = new CashReceiptStatistics(); 474 protected CashReceiptStatistics finalReceiptStats = new CashReceiptStatistics(); 475 protected CashReceiptStatistics overallReceiptStats = new CashReceiptStatistics(); 476 477 // derived 478 protected KualiDecimal verifiedReceiptSumTotal; 479 protected KualiDecimal interimReceiptSumTotal; 480 protected KualiDecimal finalReceiptSumTotal; 481 protected KualiDecimal overallReceiptSumTotal; 482 483 protected KualiDecimal remainingCheckTotal; 484 protected KualiDecimal remainingCurrencyTotal; 485 protected KualiDecimal remainingCoinTotal; 486 protected KualiDecimal remainingSumTotal; 487 488 protected boolean isDepositsFinal = false; 489 protected KualiDecimal cashieringChecksTotal; 490 protected KualiDecimal depositedCashieringChecksTotal; 491 protected KualiDecimal undepositedCashieringChecksTotal; 492 protected KualiDecimal cashDrawerCurrencyTotal; 493 protected KualiDecimal cashDrawerCoinTotal; 494 protected KualiDecimal openItemsTotal; 495 protected KualiDecimal cashDrawerTotal; 496 protected KualiDecimal interimDepositedCashieringChecksTotal; 497 protected KualiDecimal finalDepositedCashieringChecksTotal; 498 499 public CashDrawerSummary(CashManagementDocument cmDoc) { 500 timeOpened = cmDoc.getDocumentHeader().getWorkflowDocument().getCreateDate(); 501 502 resummarize(cmDoc); 503 } 504 505 public CashDrawerSummary() { 506 } 507 508 509 protected static final String[] INTERESTING_STATII = { CashReceipt.VERIFIED, CashReceipt.INTERIM, CashReceipt.FINAL }; 510 511 public void resummarize(CashManagementDocument cmDoc) { 512 // 513 // get all interesting CRs 514 String campusCode = cmDoc.getCampusCode(); 515 List<CashReceiptDocument> interestingReceipts = SpringContext.getBean(CashReceiptService.class).getCashReceipts(campusCode, INTERESTING_STATII); 516 517 518 // 519 // rather than separating into lists by status, gather statistics in one fell swoop 520 overallReceiptStats.clear(); 521 verifiedReceiptStats.clear(); 522 interimReceiptStats.clear(); 523 finalReceiptStats.clear(); 524 525 for (CashReceiptDocument receipt : interestingReceipts) { 526 String status = receipt.getDocumentHeader().getFinancialDocumentStatusCode(); 527 overallReceiptStats.add(receipt); 528 if (status.equals(CashReceipt.VERIFIED)) { 529 verifiedReceiptStats.add(receipt); 530 } 531 else if (status.equals(CashReceipt.INTERIM)) { 532 interimReceiptStats.add(receipt); 533 } 534 else if (status.equals(CashReceipt.FINAL)) { 535 finalReceiptStats.add(receipt); 536 } 537 else { 538 throw new IllegalStateException("invalid (unknown) financialDocumentStatusCode '" + status + "'"); 539 } 540 } 541 542 overallReceiptCount = overallReceiptStats.getReceiptCount(); 543 depositedReceiptCount = interimReceiptStats.getReceiptCount() + finalReceiptStats.getReceiptCount(); 544 545 // get cash drawer summary info 546 depositedCashieringChecksTotal = calculateDepositedCashieringChecksTotal(cmDoc); 547 undepositedCashieringChecksTotal = calculateUndepositedCashieringChecksTotal(cmDoc); 548 cashieringChecksTotal = depositedCashieringChecksTotal.add(undepositedCashieringChecksTotal); 549 openItemsTotal = calculateOpenItemsTotal(cmDoc); 550 cashDrawerCurrencyTotal = cmDoc.getCashDrawer().getCurrencyTotalAmount(); 551 cashDrawerCoinTotal = cmDoc.getCashDrawer().getCoinTotalAmount(); 552 cashDrawerTotal = undepositedCashieringChecksTotal.add(openItemsTotal.add(cashDrawerCurrencyTotal.add(cashDrawerCoinTotal))); 553 Map<String, KualiDecimal> results = calculateDepositedCashieringChecksTotalByDepositType(cmDoc); 554 interimDepositedCashieringChecksTotal = results.get(DepositConstants.DEPOSIT_TYPE_INTERIM); 555 KualiDecimal finalDepositCashTotal = KualiDecimal.ZERO; 556 Map<Class, Object> finalDepositCashDetails = SpringContext.getBean(CashManagementService.class).getCashDetailsForFinalDeposit(cmDoc.getDocumentNumber()); 557 KualiDecimal currencyDepositAmount = KualiDecimal.ZERO; 558 if (finalDepositCashDetails.get(CurrencyDetail.class) != null) { 559 currencyDepositAmount = ((CurrencyDetail) finalDepositCashDetails.get(CurrencyDetail.class)).getTotalAmount(); 560 } 561 KualiDecimal coinDepositAmount = KualiDecimal.ZERO; 562 if (finalDepositCashDetails.get(CoinDetail.class) != null) { 563 coinDepositAmount = ((CoinDetail) finalDepositCashDetails.get(CoinDetail.class)).getTotalAmount(); 564 } 565 finalDepositCashTotal = finalDepositCashTotal.add(currencyDepositAmount).add(coinDepositAmount); 566 finalDepositedCashieringChecksTotal = results.get(DepositConstants.DEPOSIT_TYPE_FINAL).add(finalDepositCashTotal); 567 568 569 verifiedReceiptSumTotal = verifiedReceiptStats.getSumTotal(); 570 interimReceiptSumTotal = interimReceiptStats.getCheckTotal().add(interimDepositedCashieringChecksTotal); 571 finalReceiptSumTotal = finalReceiptStats.getCheckTotal().add(finalDepositedCashieringChecksTotal); 572 overallReceiptSumTotal = overallReceiptStats.getSumTotal(); 573 574 remainingCheckTotal = overallReceiptStats.getCheckTotal().subtract(interimReceiptStats.getCheckTotal()).subtract(finalReceiptStats.getCheckTotal()); 575 remainingCurrencyTotal = overallReceiptStats.getCurrencyTotal().subtract(currencyDepositAmount).subtract(depositedCashieringChecksTotal); 576 remainingCoinTotal = overallReceiptStats.getCoinTotal().subtract(coinDepositAmount); 577 remainingSumTotal = remainingCheckTotal.add(remainingCurrencyTotal.add(remainingCoinTotal)); 578 579 isDepositsFinal = cmDoc.hasFinalDeposit(); 580 581 timeRefreshed = SpringContext.getBean(DateTimeService.class).getCurrentTimestamp(); 582 } 583 584 protected KualiDecimal calculateDepositedCashieringChecksTotal(CashManagementDocument cmDoc) { 585 return SpringContext.getBean(CashManagementService.class).calculateDepositedCheckTotal(cmDoc.getDocumentNumber()); 586 } 587 588 protected KualiDecimal calculateUndepositedCashieringChecksTotal(CashManagementDocument cmDoc) { 589 return SpringContext.getBean(CashManagementService.class).calculateUndepositedCheckTotal(cmDoc.getDocumentNumber()); 590 } 591 592 protected KualiDecimal calculateOpenItemsTotal(CashManagementDocument cmDoc) { 593 KualiDecimal total = KualiDecimal.ZERO; 594 for (CashieringItemInProcess itemInProcess : SpringContext.getBean(CashManagementService.class).getOpenItemsInProcess(cmDoc)) { 595 if (itemInProcess.getItemRemainingAmount() != null) { 596 total = total.add(itemInProcess.getItemRemainingAmount()); 597 } 598 } 599 return total; 600 } 601 602 protected Map<String, KualiDecimal> calculateDepositedCashieringChecksTotalByDepositType(CashManagementDocument cmDoc) { 603 Map<String, KualiDecimal> result = new HashMap<String, KualiDecimal>(); 604 result.put(DepositConstants.DEPOSIT_TYPE_INTERIM, KualiDecimal.ZERO); 605 result.put(DepositConstants.DEPOSIT_TYPE_FINAL, KualiDecimal.ZERO); 606 // 1. get all deposited cashiering checks 607 List<Check> checks = SpringContext.getBean(CashManagementService.class).selectDepositedCashieringChecks(cmDoc.getDocumentNumber()); 608 // 2. get all deposits 609 List<Deposit> deposits = cmDoc.getDeposits(); 610 Map<Integer, String> depositTypes = new HashMap<Integer, String>(); 611 for (Deposit deposit : deposits) { 612 depositTypes.put(deposit.getFinancialDocumentDepositLineNumber(), deposit.getDepositTypeCode()); 613 } 614 // 3. now, go through all cashiering checks, totalling them to the right deposit type 615 for (Check check : checks) { 616 KualiDecimal properTotal = result.get(depositTypes.get(check.getFinancialDocumentDepositLineNumber())); 617 properTotal = properTotal.add(check.getAmount()); 618 result.put(depositTypes.get(check.getFinancialDocumentDepositLineNumber()), properTotal); 619 } 620 return result; 621 } 622 623 /** 624 * @return current value of depositedReceiptCount. 625 */ 626 public int getDepositedReceiptCount() { 627 return depositedReceiptCount; 628 } 629 630 /** 631 * Sets the depositedReceiptCount attribute value. 632 * 633 * @param depositedReceiptCount The depositedReceiptCount to set. 634 */ 635 public void setDepositedReceiptCount(int depositedReceiptCount) { 636 this.depositedReceiptCount = depositedReceiptCount; 637 } 638 639 640 /** 641 * @return current value of finalReceiptSumTotal. 642 */ 643 public KualiDecimal getFinalReceiptSumTotal() { 644 return finalReceiptSumTotal; 645 } 646 647 /** 648 * Sets the finalReceiptSumTotal attribute value. 649 * 650 * @param finalReceiptSumTotal The finalReceiptSumTotal to set. 651 */ 652 public void setFinalReceiptSumTotal(KualiDecimal finalSumTotal) { 653 this.finalReceiptSumTotal = finalSumTotal; 654 } 655 656 657 /** 658 * @return current value of interimReceiptSumTotal. 659 */ 660 public KualiDecimal getInterimReceiptSumTotal() { 661 return interimReceiptSumTotal; 662 } 663 664 /** 665 * Sets the interimReceiptSumTotal attribute value. 666 * 667 * @param interimReceiptSumTotal The interimReceiptSumTotal to set. 668 */ 669 public void setInterimReceiptSumTotal(KualiDecimal interimSumTotal) { 670 this.interimReceiptSumTotal = interimSumTotal; 671 } 672 673 674 /** 675 * @return current value of overallReceiptCount. 676 */ 677 public int getOverallReceiptCount() { 678 return overallReceiptCount; 679 } 680 681 /** 682 * Sets the overallReceiptCount attribute value. 683 * 684 * @param overallReceiptCount The overallReceiptCount to set. 685 */ 686 public void setOverallReceiptCount(int overallReceiptCount) { 687 this.overallReceiptCount = overallReceiptCount; 688 } 689 690 691 /** 692 * @return current value of remainingCheckTotal. 693 */ 694 public KualiDecimal getRemainingCheckTotal() { 695 return remainingCheckTotal; 696 } 697 698 /** 699 * Sets the remainingCheckTotal attribute value. 700 * 701 * @param remainingCheckTotal The remainingCheckTotal to set. 702 */ 703 public void setRemainingCheckTotal(KualiDecimal remainingCheckTotal) { 704 this.remainingCheckTotal = remainingCheckTotal; 705 } 706 707 708 /** 709 * @return current value of remainingCoinTotal. 710 */ 711 public KualiDecimal getRemainingCoinTotal() { 712 return remainingCoinTotal; 713 } 714 715 /** 716 * Sets the remainingCoinTotal attribute value. 717 * 718 * @param remainingCoinTotal The remainingCoinTotal to set. 719 */ 720 public void setRemainingCoinTotal(KualiDecimal remainingCoinTotal) { 721 this.remainingCoinTotal = remainingCoinTotal; 722 } 723 724 /** 725 * @return current value of remainingCurrencyTotal. 726 */ 727 public KualiDecimal getRemainingCurrencyTotal() { 728 return remainingCurrencyTotal; 729 } 730 731 /** 732 * Sets the remainingCurrencyTotal attribute value. 733 * 734 * @param remainingCurrencyTotal The remainingCurrencyTotal to set. 735 */ 736 public void setRemainingCurrencyTotal(KualiDecimal remainingCurrencyTotal) { 737 this.remainingCurrencyTotal = remainingCurrencyTotal; 738 } 739 740 741 /** 742 * @return current value of remainingSumTotal. 743 */ 744 public KualiDecimal getRemainingSumTotal() { 745 return remainingSumTotal; 746 } 747 748 /** 749 * Sets the remainingSumTotal attribute value. 750 * 751 * @param remainingSumTotal The remainingSumTotal to set. 752 */ 753 public void setRemainingSumTotal(KualiDecimal remainingSumTotal) { 754 this.remainingSumTotal = remainingSumTotal; 755 } 756 757 758 /** 759 * @return current value of timeOpened. 760 */ 761 public Timestamp getTimeOpened() { 762 return timeOpened; 763 } 764 765 /** 766 * Sets the timeOpened attribute value. 767 * 768 * @param timeOpened The timeOpened to set. 769 */ 770 public void setTimeOpened(Timestamp timeOpened) { 771 this.timeOpened = timeOpened; 772 } 773 774 775 /** 776 * @return current value of timeRefreshed. 777 */ 778 public Timestamp getTimeRefreshed() { 779 return timeRefreshed; 780 } 781 782 /** 783 * Sets the timeRefreshed attribute value. 784 * 785 * @param timeRefreshed The timeRefreshed to set. 786 */ 787 public void setTimeRefreshed(Timestamp timeRefreshed) { 788 this.timeRefreshed = timeRefreshed; 789 } 790 791 792 /** 793 * @return current value of verifiedReceiptSumTotal. 794 */ 795 public KualiDecimal getVerifiedReceiptSumTotal() { 796 return verifiedReceiptSumTotal; 797 } 798 799 /** 800 * Sets the verifiedReceiptSumTotal attribute value. 801 * 802 * @param verifiedReceiptSumTotal The verifiedReceiptSumTotal to set. 803 */ 804 public void setVerifiedReceiptSumTotal(KualiDecimal verifiedSumTotal) { 805 this.verifiedReceiptSumTotal = verifiedSumTotal; 806 } 807 808 809 /** 810 * @return current value of overallReceiptSumTotal. 811 */ 812 public KualiDecimal getOverallReceiptSumTotal() { 813 return overallReceiptSumTotal; 814 } 815 816 /** 817 * Sets the overallReceiptSumTotal attribute value. 818 * 819 * @param overallReceiptSumTotal The overallReceiptSumTotal to set. 820 */ 821 public void setOverallReceiptSumTotal(KualiDecimal overallSumTotal) { 822 this.overallReceiptSumTotal = overallSumTotal; 823 } 824 825 826 /** 827 * @return current value of finalReceiptStats. 828 */ 829 public CashReceiptStatistics getFinalReceiptStats() { 830 return finalReceiptStats; 831 } 832 833 /** 834 * @return current value of interimReceiptStats. 835 */ 836 public CashReceiptStatistics getInterimReceiptStats() { 837 return interimReceiptStats; 838 } 839 840 /** 841 * @return current value of verifiedReceiptStats. 842 */ 843 public CashReceiptStatistics getVerifiedReceiptStats() { 844 return verifiedReceiptStats; 845 } 846 847 /** 848 * Gets the cashDrawerCoinTotal attribute. 849 * 850 * @return Returns the cashDrawerCoinTotal. 851 */ 852 public KualiDecimal getCashDrawerCoinTotal() { 853 return cashDrawerCoinTotal; 854 } 855 856 /** 857 * Gets the cashDrawerCurrencyTotal attribute. 858 * 859 * @return Returns the cashDrawerCurrencyTotal. 860 */ 861 public KualiDecimal getCashDrawerCurrencyTotal() { 862 return cashDrawerCurrencyTotal; 863 } 864 865 /** 866 * Gets the cashDrawerTotal attribute. 867 * 868 * @return Returns the cashDrawerTotal. 869 */ 870 public KualiDecimal getCashDrawerTotal() { 871 return cashDrawerTotal; 872 } 873 874 /** 875 * Gets the cashieringChecksTotal attribute. 876 * 877 * @return Returns the cashieringChecksTotal. 878 */ 879 public KualiDecimal getCashieringChecksTotal() { 880 return cashieringChecksTotal; 881 } 882 883 /** 884 * Sets the cashieringChecksTotal attribute value. 885 * 886 * @param cashieringChecksTotal The cashieringChecksTotal to set. 887 */ 888 public void setCashieringChecksTotal(KualiDecimal cashieringChecksTotal) { 889 this.cashieringChecksTotal = cashieringChecksTotal; 890 } 891 892 /** 893 * Sets the depositedCashieringChecksTotal attribute value. 894 * 895 * @param depositedCashieringChecksTotal The depositedCashieringChecksTotal to set. 896 */ 897 public void setDepositedCashieringChecksTotal(KualiDecimal depositedCashieringChecksTotal) { 898 this.depositedCashieringChecksTotal = depositedCashieringChecksTotal; 899 } 900 901 /** 902 * Gets the isDepositsFinal attribute. 903 * 904 * @return Returns the isDepositsFinal. 905 */ 906 public boolean isDepositsFinal() { 907 return isDepositsFinal; 908 } 909 910 /** 911 * Sets the cashDrawerCoinTotal attribute value. 912 * 913 * @param cashDrawerCoinTotal The cashDrawerCoinTotal to set. 914 */ 915 public void setCashDrawerCoinTotal(KualiDecimal cashDrawerCoinTotal) { 916 this.cashDrawerCoinTotal = cashDrawerCoinTotal; 917 } 918 919 /** 920 * Sets the cashDrawerCurrencyTotal attribute value. 921 * 922 * @param cashDrawerCurrencyTotal The cashDrawerCurrencyTotal to set. 923 */ 924 public void setCashDrawerCurrencyTotal(KualiDecimal cashDrawerCurrencyTotal) { 925 this.cashDrawerCurrencyTotal = cashDrawerCurrencyTotal; 926 } 927 928 /** 929 * Sets the cashDrawerTotal attribute value. 930 * 931 * @param cashDrawerTotal The cashDrawerTotal to set. 932 */ 933 public void setCashDrawerTotal(KualiDecimal cashDrawerTotal) { 934 this.cashDrawerTotal = cashDrawerTotal; 935 } 936 937 /** 938 * Sets the openItemsTotal attribute value. 939 * 940 * @param openItemsTotal The openItemsTotal to set. 941 */ 942 public void setOpenItemsTotal(KualiDecimal openItemsTotal) { 943 this.openItemsTotal = openItemsTotal; 944 } 945 946 /** 947 * Sets the undepositedCashieringChecksTotal attribute value. 948 * 949 * @param undepositedCashieringChecksTotal The undepositedCashieringChecksTotal to set. 950 */ 951 public void setUndepositedCashieringChecksTotal(KualiDecimal undepositedCashieringChecksTotal) { 952 this.undepositedCashieringChecksTotal = undepositedCashieringChecksTotal; 953 } 954 955 /** 956 * Gets the openItemsTotal attribute. 957 * 958 * @return Returns the openItemsTotal. 959 */ 960 public KualiDecimal getOpenItemsTotal() { 961 return openItemsTotal; 962 } 963 964 /** 965 * Gets the depositedCashieringChecksTotal attribute. 966 * 967 * @return Returns the depositedCashieringChecksTotal. 968 */ 969 public KualiDecimal getDepositedCashieringChecksTotal() { 970 return depositedCashieringChecksTotal; 971 } 972 973 /** 974 * Gets the undepositedCashieringChecksTotal attribute. 975 * 976 * @return Returns the undepositedCashieringChecksTotal. 977 */ 978 public KualiDecimal getUndepositedCashieringChecksTotal() { 979 return undepositedCashieringChecksTotal; 980 } 981 982 /** 983 * @return current value of overalllStats. 984 */ 985 public CashReceiptStatistics getOverallReceiptStats() { 986 return overallReceiptStats; 987 } 988 989 public static final class CashReceiptStatistics implements Serializable{ 990 protected int receiptCount; 991 protected KualiDecimal checkTotal; 992 protected KualiDecimal currencyTotal; 993 protected KualiDecimal coinTotal; 994 995 /** 996 * Constructs a SubSummary. 997 */ 998 public CashReceiptStatistics() { 999 clear(); 1000 } 1001 1002 /** 1003 * Increments the counter by 1, and the various totals by the amounts in the given CashReceiptDocument 1004 * 1005 * @param receipt 1006 */ 1007 public void add(CashReceiptDocument receipt) { 1008 receipt.refreshCashDetails(); 1009 receiptCount++; 1010 checkTotal = checkTotal.add(receipt.getTotalCheckAmount()); 1011 currencyTotal = currencyTotal.add(receipt.getTotalCashAmount()); 1012 coinTotal = coinTotal.add(receipt.getTotalCoinAmount()); 1013 } 1014 1015 /** 1016 * Zeros counter and totals. 1017 */ 1018 public void clear() { 1019 receiptCount = 0; 1020 checkTotal = KualiDecimal.ZERO; 1021 currencyTotal = KualiDecimal.ZERO; 1022 coinTotal = KualiDecimal.ZERO; 1023 } 1024 1025 1026 /** 1027 * Returns total of all check, coin, and currency totals 1028 */ 1029 public KualiDecimal getSumTotal() { 1030 KualiDecimal sumTotal = getCheckTotal().add(getCoinTotal().add(getCurrencyTotal())); 1031 1032 return sumTotal; 1033 } 1034 1035 /** 1036 * This method doesn't do anything but appease the demands of POJO form population...I mean...er...this sets the sum 1037 * total, now doesn't it? 1038 * 1039 * @param total total you want this method to ignore 1040 */ 1041 public void setSumTotal(KualiDecimal total) { 1042 // don't do anything. just be very quiet and maybe the POJO loader will be satisfied 1043 } 1044 1045 1046 /** 1047 * @return current value of checkTotal. 1048 */ 1049 public KualiDecimal getCheckTotal() { 1050 return checkTotal; 1051 } 1052 1053 /** 1054 * Sets the checkTotal attribute value. 1055 * 1056 * @param checkTotal The checkTotal to set. 1057 */ 1058 public void setCheckTotal(KualiDecimal checkTotal) { 1059 this.checkTotal = checkTotal; 1060 } 1061 1062 1063 /** 1064 * @return current value of coinTotal. 1065 */ 1066 public KualiDecimal getCoinTotal() { 1067 return coinTotal; 1068 } 1069 1070 /** 1071 * Sets the coinTotal attribute value. 1072 * 1073 * @param coinTotal The coinTotal to set. 1074 */ 1075 public void setCoinTotal(KualiDecimal coinTotal) { 1076 this.coinTotal = coinTotal; 1077 } 1078 1079 1080 /** 1081 * @return current value of currencyTotal. 1082 */ 1083 public KualiDecimal getCurrencyTotal() { 1084 return currencyTotal; 1085 } 1086 1087 /** 1088 * Sets the currencyTotal attribute value. 1089 * 1090 * @param currencyTotal The currencyTotal to set. 1091 */ 1092 public void setCurrencyTotal(KualiDecimal currencyTotal) { 1093 this.currencyTotal = currencyTotal; 1094 } 1095 1096 1097 /** 1098 * @return current value of receiptCount. 1099 */ 1100 public int getReceiptCount() { 1101 return receiptCount; 1102 } 1103 1104 /** 1105 * Sets the receiptCount attribute value. 1106 * 1107 * @param receiptCount The receiptCount to set. 1108 */ 1109 public void setReceiptCount(int receiptCount) { 1110 this.receiptCount = receiptCount; 1111 } 1112 1113 1114 /** 1115 * @see java.lang.Object#toString() 1116 */ 1117 @Override 1118 public String toString() { 1119 return "CashDrawerSummary(" + getSumTotal() + " = " + getCheckTotal() + " + " + getCurrencyTotal() + " + " + getCoinTotal() + ")"; 1120 } 1121 } 1122 } 1123 1124 /** 1125 * @see org.kuali.rice.kns.web.struts.pojo.PojoFormBase#postprocessRequestParameters(java.util.Map) 1126 */ 1127 @Override 1128 public void postprocessRequestParameters(Map requestParameters) { 1129 super.postprocessRequestParameters(requestParameters); 1130 // fish the campus code name out of the parameters 1131 String[] campusCodes = (String[]) requestParameters.get(CashManagementForm.CAMPUS_CODE_PROPERTY); 1132 String campusCode = null; 1133 if (campusCodes != null && campusCodes.length > 0) { 1134 campusCode = campusCodes[0]; 1135 } 1136 if (campusCode != null && getCashManagementDocument() != null) { 1137 // use that to put the cash drawer back into the cash management document 1138 getCashManagementDocument().setCashDrawer(SpringContext.getBean(CashDrawerService.class).getByCampusCode(campusCode)); 1139 } 1140 } 1141 1142 1143 }