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.module.ar.document.web.struts; 017 018 import java.util.ArrayList; 019 import java.util.Collection; 020 import java.util.HashMap; 021 import java.util.Iterator; 022 import java.util.List; 023 import java.util.Map; 024 025 import javax.servlet.ServletRequest; 026 import javax.servlet.http.HttpServletRequest; 027 028 import org.apache.commons.lang.StringUtils; 029 import org.apache.log4j.Logger; 030 import org.apache.struts.action.ActionMapping; 031 import org.kuali.kfs.module.ar.businessobject.AccountsReceivableDocumentHeader; 032 import org.kuali.kfs.module.ar.businessobject.InvoicePaidApplied; 033 import org.kuali.kfs.module.ar.businessobject.NonAppliedHolding; 034 import org.kuali.kfs.module.ar.businessobject.NonInvoiced; 035 import org.kuali.kfs.module.ar.businessobject.NonInvoicedDistribution; 036 import org.kuali.kfs.module.ar.document.CashControlDocument; 037 import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument; 038 import org.kuali.kfs.module.ar.document.PaymentApplicationDocument; 039 import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService; 040 import org.kuali.kfs.sys.KFSConstants; 041 import org.kuali.kfs.sys.context.SpringContext; 042 import org.kuali.kfs.sys.document.web.struts.FinancialSystemTransactionalDocumentFormBase; 043 import org.kuali.rice.kew.exception.WorkflowException; 044 import org.kuali.rice.kim.util.KimConstants; 045 import org.kuali.rice.kns.document.Document; 046 import org.kuali.rice.kns.service.DocumentService; 047 import org.kuali.rice.kns.util.KualiDecimal; 048 import org.kuali.rice.kns.util.ObjectUtils; 049 050 public class PaymentApplicationDocumentForm extends FinancialSystemTransactionalDocumentFormBase { 051 protected static Logger LOG = org.apache.log4j.Logger.getLogger(PaymentApplicationDocumentForm.class);; 052 053 protected String selectedInvoiceDocumentNumber; 054 protected String enteredInvoiceDocumentNumber; 055 protected String selectedCustomerNumber; 056 protected KualiDecimal unappliedCustomerAmount; 057 protected PaymentApplicationInvoiceApply selectedInvoiceApplication; 058 protected NonInvoiced nonInvoicedAddLine; 059 protected Integer nextNonInvoicedLineNumber; 060 protected KualiDecimal nonAppliedHoldingAmount; 061 protected String nonAppliedHoldingCustomerNumber; 062 063 protected List<PaymentApplicationInvoiceApply> invoiceApplications; 064 protected List<CustomerInvoiceDocument> invoices; 065 066 // used for non-cash-control pay app docs 067 protected List<PaymentApplicationDocument> nonAppliedControlDocs; 068 protected List<NonAppliedHolding> nonAppliedControlHoldings; 069 protected Map<String,KualiDecimal> nonAppliedControlAllocations; 070 protected Map<String,KualiDecimal> distributionsFromControlDocs; 071 072 /** 073 * Constructs a PaymentApplicationDocumentForm.java. 074 */ 075 @SuppressWarnings("unchecked") 076 public PaymentApplicationDocumentForm() { 077 super(); 078 nonInvoicedAddLine = new NonInvoiced(); 079 invoices = new ArrayList<CustomerInvoiceDocument>(); 080 selectedInvoiceApplication = null; 081 invoiceApplications = new ArrayList<PaymentApplicationInvoiceApply>(); 082 nonAppliedControlDocs = new ArrayList<PaymentApplicationDocument>(); 083 nonAppliedControlHoldings = new ArrayList<NonAppliedHolding>(); 084 nonAppliedControlAllocations = new HashMap<String,KualiDecimal>(); 085 distributionsFromControlDocs = new HashMap<String,KualiDecimal>(); 086 } 087 088 @Override 089 protected String getDefaultDocumentTypeName() { 090 return "APP"; 091 } 092 093 @Override 094 public void reset(ActionMapping mapping, ServletRequest request) { 095 super.reset(mapping, request); 096 for (PaymentApplicationInvoiceApply application : invoiceApplications) { 097 application.setQuickApply(false); 098 } 099 } 100 101 @Override 102 public void populate(HttpServletRequest request) { 103 super.populate(request); 104 105 // Set the next non-invoiced line number 106 PaymentApplicationDocument paymentApplicationDocument = getPaymentApplicationDocument(); 107 if (ObjectUtils.isNotNull(paymentApplicationDocument.getNonInvoicedDistributions())) { 108 for (NonInvoicedDistribution u : paymentApplicationDocument.getNonInvoicedDistributions()) { 109 if (null == getNextNonInvoicedLineNumber()) { 110 setNextNonInvoicedLineNumber(u.getFinancialDocumentLineNumber()); 111 } else if (u.getFinancialDocumentLineNumber() > getNextNonInvoicedLineNumber()) { 112 setNextNonInvoicedLineNumber(u.getFinancialDocumentLineNumber()); 113 } 114 } 115 } 116 117 if (null == getNextNonInvoicedLineNumber()) { 118 setNextNonInvoicedLineNumber(1); 119 } 120 121 // This step doesn't affect anything persisted to the database. It allows proper calculation 122 // of amounts for the display. 123 String customerNumber = null; 124 String docId = getDocument().getDocumentNumber(); 125 if(ObjectUtils.isNotNull(request.getParameter(KFSConstants.PARAMETER_DOC_ID)) && ObjectUtils.isNull(getDocument().getDocumentNumber())) { 126 // The document hasn't yet been set on the form. Let's look it up manually so that we can get the customer number. 127 docId = request.getParameter(KFSConstants.PARAMETER_DOC_ID).trim(); 128 DocumentService documentService = SpringContext.getBean(DocumentService.class); 129 Document d; 130 try { 131 d = documentService.getByDocumentHeaderId(docId); 132 } 133 catch (WorkflowException e) { 134 throw new RuntimeException("WorkflowException thrown when trying to load docId [" + docId + "]", e); 135 } 136 PaymentApplicationDocument pDocument = (PaymentApplicationDocument) d; 137 AccountsReceivableDocumentHeader arHeader = pDocument.getAccountsReceivableDocumentHeader(); 138 if(ObjectUtils.isNotNull(arHeader)) { 139 customerNumber = arHeader.getCustomerNumber(); 140 } 141 } 142 143 if(ObjectUtils.isNull(getSelectedInvoiceApplication())) { 144 if(ObjectUtils.isNull(invoices) || invoices.isEmpty()) { 145 if(ObjectUtils.isNotNull(customerNumber)) { 146 // get open invoices for the current customer 147 CustomerInvoiceDocumentService customerInvoiceDocumentService = SpringContext.getBean(CustomerInvoiceDocumentService.class); 148 Collection<CustomerInvoiceDocument> openInvoicesForCustomer = customerInvoiceDocumentService.getOpenInvoiceDocumentsByCustomerNumber(customerNumber); 149 setInvoices(new ArrayList<CustomerInvoiceDocument>(openInvoicesForCustomer)); 150 if (invoices != null && !invoices.isEmpty()) { 151 setSelectedInvoiceDocumentNumber(invoices.get(0).getDocumentNumber()); 152 } 153 setupInvoiceWrappers(docId); 154 } 155 } 156 } 157 } 158 159 protected void setupInvoiceWrappers(String payAppDocNumber) { 160 if (StringUtils.isBlank(payAppDocNumber)) { 161 throw new IllegalArgumentException("The payAppDocNumber parameter passed in was null or blank."); 162 } 163 164 // clear any existing 165 invoiceApplications.clear(); 166 167 if (invoices == null || invoices.isEmpty()) { 168 return; 169 } 170 171 for (CustomerInvoiceDocument invoice : invoices) { 172 PaymentApplicationInvoiceApply invoiceApplication = new PaymentApplicationInvoiceApply(payAppDocNumber, invoice); 173 addInvoiceApplication(invoiceApplication); 174 } 175 } 176 177 public Map<String,PaymentApplicationInvoiceApply> getInvoiceApplicationsByDocumentNumber() { 178 Map<String,PaymentApplicationInvoiceApply> m = new HashMap<String,PaymentApplicationInvoiceApply>(); 179 for (PaymentApplicationInvoiceApply i : invoiceApplications) { 180 m.put(i.getDocumentNumber(),i); 181 } 182 return m; 183 } 184 185 public Integer getNextNonInvoicedLineNumber() { 186 return nextNonInvoicedLineNumber; 187 } 188 189 public void setNextNonInvoicedLineNumber(Integer nextNonInvoicedLineNumber) { 190 this.nextNonInvoicedLineNumber = nextNonInvoicedLineNumber; 191 } 192 193 /** 194 * @return 195 */ 196 public KualiDecimal getNonArTotal() { 197 return null == getPaymentApplicationDocument() ? KualiDecimal.ZERO : getPaymentApplicationDocument().getNonArTotal(); 198 } 199 200 /** 201 * This method gets the payment application document 202 * 203 * @return the payment application document 204 */ 205 public PaymentApplicationDocument getPaymentApplicationDocument() { 206 return (PaymentApplicationDocument) getDocument(); 207 } 208 209 /** 210 * For a given invoiceDocNumber and invoiceItemNumber, this method will return any paidApplieds 211 * that match those two fields, if any exists. Otherwise it will return null. 212 */ 213 public InvoicePaidApplied getPaidAppliedForInvoiceDetail(String invoiceDocNumber, Integer invoiceItemNumber) { 214 if (StringUtils.isBlank(invoiceDocNumber)) { 215 throw new IllegalArgumentException("The parameter [invoiceDocNumber] passed in was blank or null."); 216 } 217 if (invoiceItemNumber == null || invoiceItemNumber.intValue() < 1) { 218 throw new IllegalArgumentException("The parameter [invoiceItemNumber] passed in was blank, zero or negative."); 219 } 220 PaymentApplicationDocument payAppDoc = getPaymentApplicationDocument(); 221 List<InvoicePaidApplied> paidApplieds = payAppDoc.getInvoicePaidApplieds(); 222 for (InvoicePaidApplied paidApplied : paidApplieds) { 223 if (invoiceDocNumber.equalsIgnoreCase(paidApplied.getFinancialDocumentReferenceInvoiceNumber())) { 224 if (invoiceItemNumber.equals(paidApplied.getInvoiceItemNumber())) { 225 return paidApplied; 226 } 227 } 228 } 229 return null; 230 } 231 232 public String getSelectedInvoiceDocumentNumber() { 233 return selectedInvoiceDocumentNumber; 234 } 235 236 public void setSelectedInvoiceDocumentNumber(String selectedInvoiceDocumentNumber) { 237 this.selectedInvoiceDocumentNumber = selectedInvoiceDocumentNumber; 238 } 239 240 public KualiDecimal getUnappliedCustomerAmount() { 241 return unappliedCustomerAmount; 242 } 243 244 public void setUnappliedCustomerAmount(KualiDecimal unappliedCustomerAmount) { 245 this.unappliedCustomerAmount = unappliedCustomerAmount; 246 } 247 248 public List<PaymentApplicationInvoiceDetailApply> getSelectedInvoiceDetailApplications() { 249 PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); 250 List<PaymentApplicationInvoiceDetailApply> detailApplications = null; 251 if (ObjectUtils.isNotNull(invoiceApplication)) { 252 detailApplications = invoiceApplication.getDetailApplications(); 253 if (null == detailApplications) { 254 detailApplications = new ArrayList<PaymentApplicationInvoiceDetailApply>(); 255 } 256 } 257 return detailApplications; 258 } 259 260 public List<PaymentApplicationInvoiceApply> getNonSelectedInvoiceApplications() { 261 String selectedInvoiceNumber = getSelectedInvoiceApplication().getDocumentNumber(); 262 263 List<PaymentApplicationInvoiceApply> nonSelectedInvoiceApplications = new ArrayList<PaymentApplicationInvoiceApply>(); 264 for (PaymentApplicationInvoiceApply invoiceApplication : invoiceApplications) { 265 if (!invoiceApplication.getDocumentNumber().equalsIgnoreCase(selectedInvoiceNumber)) { 266 nonSelectedInvoiceApplications.add(invoiceApplication); 267 } 268 } 269 return nonSelectedInvoiceApplications; 270 } 271 272 public List<PaymentApplicationInvoiceApply> getInvoiceApplications() { 273 return invoiceApplications; 274 } 275 276 public PaymentApplicationInvoiceApply getSelectedInvoiceApplication() { 277 String docNumber = getSelectedInvoiceDocumentNumber(); 278 if(ObjectUtils.isNotNull(docNumber)) { 279 return getInvoiceApplicationsByDocumentNumber().get(docNumber); 280 } else { 281 List<PaymentApplicationInvoiceApply> i = invoiceApplications; 282 if (i.isEmpty()) { 283 return null; 284 } else { 285 return invoiceApplications.get(0); 286 } 287 } 288 } 289 290 public List<CustomerInvoiceDocument> getInvoices() { 291 return invoices; 292 } 293 294 public void setInvoices(ArrayList<CustomerInvoiceDocument> invoices) { 295 this.invoices = invoices; 296 } 297 298 public String getEnteredInvoiceDocumentNumber() { 299 return enteredInvoiceDocumentNumber; 300 } 301 302 public void setEnteredInvoiceDocumentNumber(String enteredInvoiceDocumentNumber) { 303 this.enteredInvoiceDocumentNumber = enteredInvoiceDocumentNumber; 304 } 305 306 /** 307 * 308 * This special casing for negative applieds is a display issue. We basically dont 309 * want to ever display that they applied a negative amount, even while they may 310 * have an unsaved document with negative applications that are failing validations. 311 * 312 * @return 313 */ 314 public KualiDecimal getTotalApplied() { 315 KualiDecimal totalApplied = getPaymentApplicationDocument().getTotalApplied(); 316 if (totalApplied.isPositive()) { 317 return totalApplied; 318 } 319 else { 320 return KualiDecimal.ZERO; 321 } 322 } 323 324 public KualiDecimal getUnallocatedBalance() { 325 return getTotalFromControl().subtract(getTotalApplied()); 326 } 327 328 /** 329 * 330 * Returns the control total available for this document, whether its 331 * a cash-control style payapp, or a nonapplied style payapp. 332 * 333 * @return 334 */ 335 public KualiDecimal getTotalFromControl() { 336 PaymentApplicationDocument payAppDoc = (PaymentApplicationDocument) getDocument(); 337 if (payAppDoc.hasCashControlDetail()) { 338 return payAppDoc.getTotalFromControl(); 339 } 340 else { 341 return getNonAppliedControlAvailableUnappliedAmount(); 342 } 343 } 344 345 /** 346 * This method retrieves a specific customer invoice detail from the list, by array index 347 * 348 * @param index the index of the customer invoice detail to retrieve 349 * @return a CustomerInvoiceDetail 350 */ 351 public PaymentApplicationInvoiceDetailApply getInvoiceDetailApplication(int index) { 352 List<PaymentApplicationInvoiceDetailApply> details = getSelectedInvoiceDetailApplications(); 353 return details.get(index); 354 } 355 356 /** 357 * This method retrieves a specific customer invoice from the list, by array index 358 * 359 * @param index the index of the customer invoice to retrieve 360 * @return a CustomerInvoiceDocument 361 */ 362 public PaymentApplicationInvoiceApply getInvoiceApplication(int index) { 363 return (PaymentApplicationInvoiceApply) invoiceApplications.get(index); 364 } 365 366 @SuppressWarnings("unchecked") 367 public void setInvoiceDetailApplication(int key, PaymentApplicationInvoiceDetailApply value) { 368 getSelectedInvoiceDetailApplications().set(key, value); 369 } 370 371 public KualiDecimal getSelectedInvoiceBalance() { 372 PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); 373 return invoiceApplication.getOpenAmount(); 374 } 375 376 public KualiDecimal getSelectedInvoiceTotalAmount() { 377 PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); 378 return invoiceApplication.getInvoice().getSourceTotal(); 379 } 380 381 public KualiDecimal getAmountAppliedDirectlyToInvoice() { 382 PaymentApplicationInvoiceApply invoiceApplicationToFind = getSelectedInvoiceApplication(); 383 KualiDecimal amount = new KualiDecimal(0); 384 for (PaymentApplicationInvoiceApply invoiceApplication : invoiceApplications) { 385 if (invoiceApplicationToFind.getDocumentNumber().equalsIgnoreCase(invoiceApplication.getDocumentNumber())) { 386 amount = amount.add(invoiceApplication.getAmountToApply()); 387 } 388 } 389 return amount; 390 } 391 392 /** 393 * This method gets the previous invoice document number 394 * 395 * @return the previous invoice document number 396 */ 397 public String getPreviousInvoiceDocumentNumber() { 398 CustomerInvoiceDocument _previousInvoiceDocument = null; 399 400 PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); 401 CustomerInvoiceDocument selectedInvoiceDocument = invoiceApplication == null ? null : invoiceApplication.getInvoice(); 402 if (null == selectedInvoiceDocument || 2 > invoices.size()) { 403 _previousInvoiceDocument = null; 404 } else { 405 Iterator<CustomerInvoiceDocument> iterator = invoices.iterator(); 406 CustomerInvoiceDocument previousInvoiceDocument = iterator.next(); 407 String selectedInvoiceDocumentNumber = selectedInvoiceDocument.getDocumentNumber(); 408 if (null != selectedInvoiceDocumentNumber && selectedInvoiceDocumentNumber.equals(previousInvoiceDocument.getDocumentNumber())) { 409 _previousInvoiceDocument = null; 410 } else { 411 while (iterator.hasNext()) { 412 CustomerInvoiceDocument currentInvoiceDocument = iterator.next(); 413 String currentInvoiceDocumentNumber = currentInvoiceDocument.getDocumentNumber(); 414 if (null != currentInvoiceDocumentNumber && currentInvoiceDocumentNumber.equals(selectedInvoiceDocument.getDocumentNumber())) { 415 _previousInvoiceDocument = previousInvoiceDocument; 416 } else { 417 previousInvoiceDocument = currentInvoiceDocument; 418 } 419 } 420 } 421 } 422 423 return null == _previousInvoiceDocument ? "" : _previousInvoiceDocument.getDocumentNumber(); 424 } 425 426 /** 427 * This method gets the next invoice document number 428 * 429 * @return the next invoice document number 430 */ 431 public String getNextInvoiceDocumentNumber() { 432 CustomerInvoiceDocument _nextInvoiceDocument = null; 433 434 PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); 435 CustomerInvoiceDocument selectedInvoiceDocument = invoiceApplication == null ? null : invoiceApplication.getInvoice(); 436 if (null == selectedInvoiceDocument || 2 > invoices.size()) { 437 _nextInvoiceDocument = null; 438 } else { 439 Iterator<CustomerInvoiceDocument> iterator = invoices.iterator(); 440 while (iterator.hasNext()) { 441 CustomerInvoiceDocument currentInvoiceDocument = iterator.next(); 442 String currentInvoiceDocumentNumber = currentInvoiceDocument.getDocumentNumber(); 443 if (currentInvoiceDocumentNumber.equals(selectedInvoiceDocument.getDocumentNumber())) { 444 if (iterator.hasNext()) { 445 _nextInvoiceDocument = iterator.next(); 446 } else { 447 _nextInvoiceDocument = null; 448 } 449 } 450 } 451 } 452 453 return null == _nextInvoiceDocument ? "" : _nextInvoiceDocument.getDocumentNumber(); 454 } 455 456 /** 457 * This method gets the Cash Control document for the payment application document 458 * 459 * @return the cash control document 460 */ 461 public CashControlDocument getCashControlDocument() { 462 return getPaymentApplicationDocument().getCashControlDocument(); 463 } 464 465 public NonInvoiced getNonInvoicedAddLine() { 466 return nonInvoicedAddLine; 467 } 468 469 public void setNonInvoicedAddLine(NonInvoiced nonInvoicedAddLine) { 470 this.nonInvoicedAddLine = nonInvoicedAddLine; 471 } 472 473 public Integer getNonInvoicedAddLineItemNumber() { 474 Integer number = new Integer(0); 475 if (null != getPaymentApplicationDocument()) { 476 Collection<NonInvoiced> items = getPaymentApplicationDocument().getNonInvoiceds(); 477 for (NonInvoiced item : items) { 478 Integer i = item.getFinancialDocumentLineNumber(); 479 if (i > number) { 480 number = i; 481 } 482 } 483 } 484 return number + 1; 485 } 486 487 public PaymentApplicationInvoiceApply getInvoiceApplication(String documentNumber) { 488 if (StringUtils.isBlank(documentNumber)) { 489 throw new RuntimeException("The parameter passed in [documentNumber] was null or blank."); 490 } 491 for (PaymentApplicationInvoiceApply invoiceApplication : invoiceApplications) { 492 if (documentNumber.equalsIgnoreCase(invoiceApplication.getDocumentNumber())) { 493 return invoiceApplication; 494 } 495 } 496 return null; 497 } 498 499 public void addInvoiceApplication(PaymentApplicationInvoiceApply invoiceApplicationToAdd) { 500 if (invoiceApplicationToAdd == null) { 501 throw new RuntimeException("The parameter passed in [invoiceApplicationToAdd] was null."); 502 } 503 for (int i = 0; i < invoiceApplications.size(); i++) { 504 PaymentApplicationInvoiceApply invoiceApplication = invoiceApplications.get(i); 505 if (invoiceApplicationToAdd.getDocumentNumber().equalsIgnoreCase(invoiceApplication.getDocumentNumber())) { 506 invoiceApplications.set(i, invoiceApplicationToAdd); 507 } 508 } 509 invoiceApplications.add(invoiceApplicationToAdd); 510 } 511 512 public String getSelectedCustomerNumber() { 513 return selectedCustomerNumber; 514 } 515 516 public void setSelectedCustomerNumber(String selectedCustomerNumber) { 517 this.selectedCustomerNumber = StringUtils.isBlank(selectedCustomerNumber) ? null : selectedCustomerNumber.toUpperCase(); 518 } 519 520 public KualiDecimal getNonAppliedHoldingAmount() { 521 return nonAppliedHoldingAmount; 522 } 523 524 public void setNonAppliedHoldingAmount(KualiDecimal nonAppliedHoldingAmount) { 525 this.nonAppliedHoldingAmount = nonAppliedHoldingAmount; 526 } 527 528 public String getNonAppliedHoldingCustomerNumber() { 529 return nonAppliedHoldingCustomerNumber; 530 } 531 532 public void setNonAppliedHoldingCustomerNumber(String nonAppliedHoldingCustomerNumber) { 533 this.nonAppliedHoldingCustomerNumber = nonAppliedHoldingCustomerNumber; 534 } 535 536 public List<PaymentApplicationDocument> getNonAppliedControlDocs() { 537 return nonAppliedControlDocs; 538 } 539 540 public void setNonAppliedControlDocs(List<PaymentApplicationDocument> nonAppliedControlDocs) { 541 this.nonAppliedControlDocs = nonAppliedControlDocs; 542 } 543 544 /** 545 * 546 * Returns the total amount of previously NonApplied funds available 547 * to apply to invoices and other applications on this document. 548 * 549 * @return 550 */ 551 public KualiDecimal getNonAppliedControlAvailableUnappliedAmount() { 552 KualiDecimal amount = KualiDecimal.ZERO; 553 for (NonAppliedHolding nonAppliedHolding : nonAppliedControlHoldings) { 554 amount = amount.add(nonAppliedHolding.getAvailableUnappliedAmount()); 555 } 556 return amount; 557 } 558 559 public List<NonAppliedHolding> getNonAppliedControlHoldings() { 560 return nonAppliedControlHoldings; 561 } 562 563 public void setNonAppliedControlHoldings(List<NonAppliedHolding> nonAppliedControlHoldings) { 564 this.nonAppliedControlHoldings = nonAppliedControlHoldings; 565 } 566 567 /** 568 * 569 * Used for when the doc is final, to show the control docs section. 570 * @return 571 */ 572 public Map<String,KualiDecimal> getDistributionsFromControlDocs() { 573 if (distributionsFromControlDocs == null || distributionsFromControlDocs.isEmpty()) { 574 distributionsFromControlDocs = getPaymentApplicationDocument().getDistributionsFromControlDocuments(); 575 } 576 return distributionsFromControlDocs; 577 } 578 579 /** 580 * 581 * Used for when the doc is live, to show the control docs section. 582 * @return 583 */ 584 public Map<String,KualiDecimal> getNonAppliedControlAllocations() { 585 if (nonAppliedControlAllocations == null || nonAppliedControlAllocations.isEmpty()) { 586 nonAppliedControlAllocations = getPaymentApplicationDocument().allocateFundsFromUnappliedControls(nonAppliedControlHoldings, getTotalApplied()); 587 } 588 return nonAppliedControlAllocations; 589 } 590 591 public void setNonAppliedControlAllocations(Map<String, KualiDecimal> nonAppliedControlAllocations) { 592 this.nonAppliedControlAllocations = nonAppliedControlAllocations; 593 } 594 595 public KualiDecimal getNonAppliedControlAllocation(String documentNumber) { 596 if (!getNonAppliedControlAllocations().containsKey(documentNumber)) { 597 return KualiDecimal.ZERO; 598 } 599 return getNonAppliedControlAllocations().get(documentNumber); 600 } 601 602 /** 603 * @see org.kuali.rice.kns.web.struts.form.KualiTransactionalDocumentFormBase#populateFalseCheckboxes(javax.servlet.http.HttpServletRequest) 604 */ 605 @Override 606 protected void populateFalseCheckboxes(HttpServletRequest request) { 607 Map<String, String[]> parameterMap = request.getParameterMap(); 608 if (parameterMap.get("checkboxToReset") != null) { 609 final String[] checkboxesToReset = request.getParameterValues("checkboxToReset"); 610 if(checkboxesToReset != null && checkboxesToReset.length > 0) { 611 for (int i = 0; i < checkboxesToReset.length; i++) { 612 String propertyName = (String) checkboxesToReset[i]; 613 if ( !StringUtils.isBlank(propertyName) && parameterMap.get(propertyName) == null ) { 614 try { 615 populateForProperty(propertyName, KimConstants.KIM_ATTRIBUTE_BOOLEAN_FALSE_STR_VALUE_DISPLAY, parameterMap); 616 } catch (RuntimeException ex) { 617 618 } 619 } 620 else if ( !StringUtils.isBlank(propertyName) && parameterMap.get(propertyName) != null && parameterMap.get(propertyName).length >= 1 && parameterMap.get(propertyName)[0].equalsIgnoreCase("on") ) { 621 try { 622 populateForProperty(propertyName, KimConstants.KIM_ATTRIBUTE_BOOLEAN_TRUE_STR_VALUE_DISPLAY, parameterMap); 623 } catch (RuntimeException ex) { 624 625 } 626 } 627 } 628 } 629 } } 630 631 }