/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.ar.document.web.struts; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts.action.ActionMapping; import org.kuali.kfs.module.ar.ArConstants; import org.kuali.kfs.module.ar.businessobject.AccountsReceivableDocumentHeader; import org.kuali.kfs.module.ar.businessobject.InvoicePaidApplied; import org.kuali.kfs.module.ar.businessobject.NonAppliedHolding; import org.kuali.kfs.module.ar.businessobject.NonInvoiced; import org.kuali.kfs.module.ar.businessobject.NonInvoicedDistribution; import org.kuali.kfs.module.ar.document.CashControlDocument; import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument; import org.kuali.kfs.module.ar.document.PaymentApplicationDocument; import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.web.struts.FinancialSystemTransactionalDocumentFormBase; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.kim.api.KimConstants; import org.kuali.rice.krad.document.Document; import org.kuali.rice.krad.service.DocumentService; import org.kuali.rice.krad.util.ObjectUtils; public class PaymentApplicationDocumentForm extends FinancialSystemTransactionalDocumentFormBase { protected static Logger LOG = org.apache.log4j.Logger.getLogger(PaymentApplicationDocumentForm.class);; protected String selectedInvoiceDocumentNumber; protected String enteredInvoiceDocumentNumber; protected String selectedCustomerNumber; protected KualiDecimal unappliedCustomerAmount; protected PaymentApplicationInvoiceApply selectedInvoiceApplication; protected NonInvoiced nonInvoicedAddLine; protected Integer nextNonInvoicedLineNumber; protected KualiDecimal nonAppliedHoldingAmount; protected String nonAppliedHoldingCustomerNumber; protected List<PaymentApplicationInvoiceApply> invoiceApplications; protected List<CustomerInvoiceDocument> invoices; // used for non-cash-control pay app docs protected List<PaymentApplicationDocument> nonAppliedControlDocs; protected List<NonAppliedHolding> nonAppliedControlHoldings; protected Map<String, KualiDecimal> nonAppliedControlAllocations; protected Map<String, KualiDecimal> distributionsFromControlDocs; /** * Constructs a PaymentApplicationDocumentForm.java. */ @SuppressWarnings("unchecked") public PaymentApplicationDocumentForm() { super(); nonInvoicedAddLine = new NonInvoiced(); invoices = new ArrayList<CustomerInvoiceDocument>(); selectedInvoiceApplication = null; invoiceApplications = new ArrayList<PaymentApplicationInvoiceApply>(); nonAppliedControlDocs = new ArrayList<PaymentApplicationDocument>(); nonAppliedControlHoldings = new ArrayList<NonAppliedHolding>(); nonAppliedControlAllocations = new HashMap<String, KualiDecimal>(); distributionsFromControlDocs = new HashMap<String, KualiDecimal>(); } /** * @see org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase#getDefaultDocumentTypeName() */ @Override protected String getDefaultDocumentTypeName() { return ArConstants.PAYMENT_APPLICATION_DOCUMENT_TYPE_CODE; } /** * @see org.kuali.rice.kns.web.struts.form.KualiForm#reset(org.apache.struts.action.ActionMapping, javax.servlet.ServletRequest) */ @Override public void reset(ActionMapping mapping, ServletRequest request) { super.reset(mapping, request); for (PaymentApplicationInvoiceApply application : invoiceApplications) { application.setQuickApply(false); } } /** * @see org.kuali.rice.kns.web.struts.form.KualiTransactionalDocumentFormBase#populate(javax.servlet.http.HttpServletRequest) */ @Override public void populate(HttpServletRequest request) { super.populate(request); // Set the next non-invoiced line number PaymentApplicationDocument paymentApplicationDocument = getPaymentApplicationDocument(); if (ObjectUtils.isNotNull(paymentApplicationDocument.getNonInvoicedDistributions())) { for (NonInvoicedDistribution u : paymentApplicationDocument.getNonInvoicedDistributions()) { if (null == getNextNonInvoicedLineNumber()) { setNextNonInvoicedLineNumber(u.getFinancialDocumentLineNumber()); } else if (u.getFinancialDocumentLineNumber() > getNextNonInvoicedLineNumber()) { setNextNonInvoicedLineNumber(u.getFinancialDocumentLineNumber()); } } } if (null == getNextNonInvoicedLineNumber()) { setNextNonInvoicedLineNumber(1); } // This step doesn't affect anything persisted to the database. It allows proper calculation // of amounts for the display. String customerNumber = null; String docId = getDocument().getDocumentNumber(); if (ObjectUtils.isNotNull(request.getParameter(KFSConstants.PARAMETER_DOC_ID)) && ObjectUtils.isNull(getDocument().getDocumentNumber())) { // The document hasn't yet been set on the form. Let's look it up manually so that we can get the customer number. docId = request.getParameter(KFSConstants.PARAMETER_DOC_ID).trim(); DocumentService documentService = SpringContext.getBean(DocumentService.class); Document d; try { d = documentService.getByDocumentHeaderId(docId); } catch (WorkflowException e) { throw new RuntimeException("WorkflowException thrown when trying to load docId [" + docId + "]", e); } PaymentApplicationDocument pDocument = (PaymentApplicationDocument) d; AccountsReceivableDocumentHeader arHeader = pDocument.getAccountsReceivableDocumentHeader(); if (ObjectUtils.isNotNull(arHeader)) { customerNumber = arHeader.getCustomerNumber(); } } if(ObjectUtils.isNull(getSelectedInvoiceApplication())) { if(ObjectUtils.isNull(invoices) || invoices.isEmpty()) { if(ObjectUtils.isNotNull(customerNumber)) { // get open invoices for the current customer CustomerInvoiceDocumentService customerInvoiceDocumentService = SpringContext.getBean(CustomerInvoiceDocumentService.class); Collection<CustomerInvoiceDocument> openInvoicesForCustomer = customerInvoiceDocumentService.getOpenInvoiceDocumentsByCustomerNumber(customerNumber); setInvoices(new ArrayList<CustomerInvoiceDocument>(openInvoicesForCustomer)); if (invoices != null && !invoices.isEmpty()) { setSelectedInvoiceDocumentNumber(invoices.get(0).getDocumentNumber()); } setupInvoiceWrappers(docId); } } } } /** * @param payAppDocNumber */ protected void setupInvoiceWrappers(String payAppDocNumber) { if (StringUtils.isBlank(payAppDocNumber)) { throw new IllegalArgumentException("The payAppDocNumber parameter passed in was null or blank."); } // clear any existing invoiceApplications.clear(); if (invoices == null || invoices.isEmpty()) { return; } for (CustomerInvoiceDocument invoice : invoices) { PaymentApplicationInvoiceApply invoiceApplication = new PaymentApplicationInvoiceApply(payAppDocNumber, invoice); addInvoiceApplication(invoiceApplication); } } /** * @return */ public Map<String, PaymentApplicationInvoiceApply> getInvoiceApplicationsByDocumentNumber() { Map<String, PaymentApplicationInvoiceApply> m = new HashMap<String, PaymentApplicationInvoiceApply>(); for (PaymentApplicationInvoiceApply i : invoiceApplications) { m.put(i.getDocumentNumber(), i); } return m; } /** * @return */ public Integer getNextNonInvoicedLineNumber() { return nextNonInvoicedLineNumber; } /** * @param nextNonInvoicedLineNumber */ public void setNextNonInvoicedLineNumber(Integer nextNonInvoicedLineNumber) { this.nextNonInvoicedLineNumber = nextNonInvoicedLineNumber; } /** * @return */ public KualiDecimal getNonArTotal() { return null == getPaymentApplicationDocument() ? KualiDecimal.ZERO : getPaymentApplicationDocument().getNonArTotal(); } /** * This method gets the payment application document * * @return the payment application document */ public PaymentApplicationDocument getPaymentApplicationDocument() { return (PaymentApplicationDocument) getDocument(); } /** * For a given invoiceDocNumber and invoiceItemNumber, this method will return any paidApplieds that match those two fields, if * any exists. Otherwise it will return null. */ public InvoicePaidApplied getPaidAppliedForInvoiceDetail(String invoiceDocNumber, Integer invoiceItemNumber) { if (StringUtils.isBlank(invoiceDocNumber)) { throw new IllegalArgumentException("The parameter [invoiceDocNumber] passed in was blank or null."); } if (invoiceItemNumber == null || invoiceItemNumber.intValue() < 1) { throw new IllegalArgumentException("The parameter [invoiceItemNumber] passed in was blank, zero or negative."); } PaymentApplicationDocument payAppDoc = getPaymentApplicationDocument(); List<InvoicePaidApplied> paidApplieds = payAppDoc.getInvoicePaidApplieds(); for (InvoicePaidApplied paidApplied : paidApplieds) { if (invoiceDocNumber.equalsIgnoreCase(paidApplied.getFinancialDocumentReferenceInvoiceNumber())) { if (invoiceItemNumber.equals(paidApplied.getInvoiceItemNumber())) { return paidApplied; } } } return null; } public String getSelectedInvoiceDocumentNumber() { return selectedInvoiceDocumentNumber; } public void setSelectedInvoiceDocumentNumber(String selectedInvoiceDocumentNumber) { this.selectedInvoiceDocumentNumber = selectedInvoiceDocumentNumber; } public KualiDecimal getUnappliedCustomerAmount() { return unappliedCustomerAmount; } public void setUnappliedCustomerAmount(KualiDecimal unappliedCustomerAmount) { this.unappliedCustomerAmount = unappliedCustomerAmount; } /** * @return */ public List<PaymentApplicationInvoiceDetailApply> getSelectedInvoiceDetailApplications() { PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); List<PaymentApplicationInvoiceDetailApply> detailApplications = null; if (ObjectUtils.isNotNull(invoiceApplication)) { detailApplications = invoiceApplication.getDetailApplications(); if (null == detailApplications) { detailApplications = new ArrayList<PaymentApplicationInvoiceDetailApply>(); } } return detailApplications; } /** * @return */ public List<PaymentApplicationInvoiceApply> getNonSelectedInvoiceApplications() { String selectedInvoiceNumber = getSelectedInvoiceApplication().getDocumentNumber(); List<PaymentApplicationInvoiceApply> nonSelectedInvoiceApplications = new ArrayList<PaymentApplicationInvoiceApply>(); for (PaymentApplicationInvoiceApply invoiceApplication : invoiceApplications) { if (!invoiceApplication.getDocumentNumber().equalsIgnoreCase(selectedInvoiceNumber)) { nonSelectedInvoiceApplications.add(invoiceApplication); } } return nonSelectedInvoiceApplications; } /** * An inner class to point to a specific entry in a group */ protected class EntryHolder { private Date date; private Object holder; /** * Constructs a NonAppliedHolding.EntryHolder * @param NonAppliedHolding the entry to point to * @param Date of doc */ public EntryHolder(Date date, Object holder) { this.date = date; this.holder = holder; } public Date getDate() { return this.date; } public Object getHolder() { return this.holder; } } /** * This comparator is used internally for sorting the list of invoices */ protected static class EntryHolderComparator implements Comparator<EntryHolder> { /** * Compares two Objects based on their creation date * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(EntryHolder rosencrantz, EntryHolder guildenstern) { return rosencrantz.getDate().compareTo(guildenstern.getDate()); } } //https://jira.kuali.org/browse/KFSCNTRB-1377 //Turn into a simple getter and setter to prevent refetching and presort collection //on load public List<PaymentApplicationInvoiceApply> getInvoiceApplications() { return invoiceApplications; } public void setInvoiceApplications(List<PaymentApplicationInvoiceApply> invoiceApplications){ this.invoiceApplications = invoiceApplications; } public PaymentApplicationInvoiceApply getSelectedInvoiceApplication() { String docNumber = getSelectedInvoiceDocumentNumber(); if (ObjectUtils.isNotNull(docNumber)) { return getInvoiceApplicationsByDocumentNumber().get(docNumber); } else { List<PaymentApplicationInvoiceApply> i = invoiceApplications; if (i.isEmpty()) { return null; } else { return invoiceApplications.get(0); } } } public List<CustomerInvoiceDocument> getInvoices() { return invoices; } public void setInvoices(ArrayList<CustomerInvoiceDocument> invoices) { this.invoices = invoices; } public String getEnteredInvoiceDocumentNumber() { return enteredInvoiceDocumentNumber; } public void setEnteredInvoiceDocumentNumber(String enteredInvoiceDocumentNumber) { this.enteredInvoiceDocumentNumber = enteredInvoiceDocumentNumber; } /** * This special casing for negative applieds is a display issue. We basically dont want to ever display that they applied a * negative amount, even while they may have an unsaved document with negative applications that are failing validations. * * @return */ public KualiDecimal getTotalApplied() { KualiDecimal totalApplied = getPaymentApplicationDocument().getTotalApplied(); if (totalApplied.isPositive()) { return totalApplied; } else { return KualiDecimal.ZERO; } } public KualiDecimal getUnallocatedBalance() { return getTotalFromControl().subtract(getTotalApplied()); } /** * Returns the control total available for this document, whether its a cash-control style payapp, or a nonapplied style payapp. * * @return */ public KualiDecimal getTotalFromControl() { PaymentApplicationDocument payAppDoc = (PaymentApplicationDocument) getDocument(); if (payAppDoc.hasCashControlDetail()) { return payAppDoc.getTotalFromControl(); } else { return getNonAppliedControlAvailableUnappliedAmount(); } } /** * This method retrieves a specific customer invoice detail from the list, by array index * * @param index the index of the customer invoice detail to retrieve * @return a CustomerInvoiceDetail */ public PaymentApplicationInvoiceDetailApply getInvoiceDetailApplication(int index) { List<PaymentApplicationInvoiceDetailApply> details = getSelectedInvoiceDetailApplications(); return details.get(index); } /** * This method retrieves a specific customer invoice from the list, by array index * * @param index the index of the customer invoice to retrieve * @return a CustomerInvoiceDocument */ public PaymentApplicationInvoiceApply getInvoiceApplication(int index) { return invoiceApplications.get(index); } @SuppressWarnings("unchecked") public void setInvoiceDetailApplication(int key, PaymentApplicationInvoiceDetailApply value) { getSelectedInvoiceDetailApplications().set(key, value); } /** * @return */ public KualiDecimal getSelectedInvoiceBalance() { PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); return invoiceApplication.getOpenAmount(); } /** * @return */ public KualiDecimal getSelectedInvoiceTotalAmount() { PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); return invoiceApplication.getInvoice().getSourceTotal(); } /** * @return */ public KualiDecimal getAmountAppliedDirectlyToInvoice() { PaymentApplicationInvoiceApply invoiceApplicationToFind = getSelectedInvoiceApplication(); KualiDecimal amount = new KualiDecimal(0); for (PaymentApplicationInvoiceApply invoiceApplication : invoiceApplications) { if (invoiceApplicationToFind.getDocumentNumber().equalsIgnoreCase(invoiceApplication.getDocumentNumber())) { amount = amount.add(invoiceApplication.getAmountToApply()); } } return amount; } /** * This method gets the previous invoice document number * * @return the previous invoice document number */ public String getPreviousInvoiceDocumentNumber() { CustomerInvoiceDocument previousInvoiceDocument = null; PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); CustomerInvoiceDocument selectedInvoiceDocument = invoiceApplication == null ? null : invoiceApplication.getInvoice(); if (null == selectedInvoiceDocument || 2 > invoices.size()) { previousInvoiceDocument = null; } else { Iterator<CustomerInvoiceDocument> iterator = invoices.iterator(); CustomerInvoiceDocument customerInvoiceDocument = iterator.next(); String selectedInvoiceDocumentNumber = selectedInvoiceDocument.getDocumentNumber(); if (null != selectedInvoiceDocumentNumber && selectedInvoiceDocumentNumber.equals(customerInvoiceDocument.getDocumentNumber())) { previousInvoiceDocument = null; } else { while (iterator.hasNext()) { CustomerInvoiceDocument currentInvoiceDocument = iterator.next(); String currentInvoiceDocumentNumber = currentInvoiceDocument.getDocumentNumber(); if (null != currentInvoiceDocumentNumber && currentInvoiceDocumentNumber.equals(selectedInvoiceDocument.getDocumentNumber())) { previousInvoiceDocument = customerInvoiceDocument; } else { customerInvoiceDocument = currentInvoiceDocument; } } } } return null == previousInvoiceDocument ? "" : previousInvoiceDocument.getDocumentNumber(); } /** * This method gets the next invoice document number * * @return the next invoice document number */ public String getNextInvoiceDocumentNumber() { CustomerInvoiceDocument nextInvoiceDocument = null; PaymentApplicationInvoiceApply invoiceApplication = getSelectedInvoiceApplication(); CustomerInvoiceDocument selectedInvoiceDocument = invoiceApplication == null ? null : invoiceApplication.getInvoice(); if (null == selectedInvoiceDocument || 2 > invoices.size()) { nextInvoiceDocument = null; } else { Iterator<CustomerInvoiceDocument> iterator = invoices.iterator(); while (iterator.hasNext()) { CustomerInvoiceDocument currentInvoiceDocument = iterator.next(); String currentInvoiceDocumentNumber = currentInvoiceDocument.getDocumentNumber(); if (currentInvoiceDocumentNumber.equals(selectedInvoiceDocument.getDocumentNumber())) { if (iterator.hasNext()) { nextInvoiceDocument = iterator.next(); } else { nextInvoiceDocument = null; } } } } return null == nextInvoiceDocument ? "" : nextInvoiceDocument.getDocumentNumber(); } /** * This method gets the Cash Control document for the payment application document * * @return the cash control document */ public CashControlDocument getCashControlDocument() { return getPaymentApplicationDocument().getCashControlDocument(); } public NonInvoiced getNonInvoicedAddLine() { return nonInvoicedAddLine; } public void setNonInvoicedAddLine(NonInvoiced nonInvoicedAddLine) { this.nonInvoicedAddLine = nonInvoicedAddLine; } /** * @return */ public Integer getNonInvoicedAddLineItemNumber() { Integer number = new Integer(0); if (null != getPaymentApplicationDocument()) { Collection<NonInvoiced> items = getPaymentApplicationDocument().getNonInvoiceds(); for (NonInvoiced item : items) { Integer i = item.getFinancialDocumentLineNumber(); if (i > number) { number = i; } } } return number + 1; } /** * @param documentNumber * @return */ public PaymentApplicationInvoiceApply getInvoiceApplication(String documentNumber) { if (StringUtils.isBlank(documentNumber)) { throw new RuntimeException("The parameter passed in [documentNumber] was null or blank."); } for (PaymentApplicationInvoiceApply invoiceApplication : invoiceApplications) { if (documentNumber.equalsIgnoreCase(invoiceApplication.getDocumentNumber())) { return invoiceApplication; } } return null; } /** * @param invoiceApplicationToAdd */ public void addInvoiceApplication(PaymentApplicationInvoiceApply invoiceApplicationToAdd) { if (invoiceApplicationToAdd == null) { throw new RuntimeException("The parameter passed in [invoiceApplicationToAdd] was null."); } for (int i = 0; i < invoiceApplications.size(); i++) { PaymentApplicationInvoiceApply invoiceApplication = invoiceApplications.get(i); if (invoiceApplicationToAdd.getDocumentNumber().equalsIgnoreCase(invoiceApplication.getDocumentNumber())) { invoiceApplications.set(i, invoiceApplicationToAdd); } } invoiceApplications.add(invoiceApplicationToAdd); } public String getSelectedCustomerNumber() { return selectedCustomerNumber; } public void setSelectedCustomerNumber(String selectedCustomerNumber) { this.selectedCustomerNumber = StringUtils.isBlank(selectedCustomerNumber) ? null : selectedCustomerNumber.toUpperCase(); } public KualiDecimal getNonAppliedHoldingAmount() { return nonAppliedHoldingAmount; } public void setNonAppliedHoldingAmount(KualiDecimal nonAppliedHoldingAmount) { this.nonAppliedHoldingAmount = nonAppliedHoldingAmount; } public String getNonAppliedHoldingCustomerNumber() { return nonAppliedHoldingCustomerNumber; } public void setNonAppliedHoldingCustomerNumber(String nonAppliedHoldingCustomerNumber) { this.nonAppliedHoldingCustomerNumber = nonAppliedHoldingCustomerNumber; } public List<PaymentApplicationDocument> getNonAppliedControlDocs() { return nonAppliedControlDocs; } public void setNonAppliedControlDocs(List<PaymentApplicationDocument> nonAppliedControlDocs) { this.nonAppliedControlDocs = nonAppliedControlDocs; } /** * Returns the total amount of previously NonApplied funds available to apply to invoices and other applications on this * document. * * @return */ public KualiDecimal getNonAppliedControlAvailableUnappliedAmount() { KualiDecimal amount = KualiDecimal.ZERO; for (NonAppliedHolding nonAppliedHolding : nonAppliedControlHoldings) { amount = amount.add(nonAppliedHolding.getAvailableUnappliedAmount()); } return amount; } public List<NonAppliedHolding> getNonAppliedControlHoldings() { EntryHolderComparator entryHolderComparator = new EntryHolderComparator(); List <EntryHolder> entryHoldings = new ArrayList<EntryHolder>(); for (NonAppliedHolding nonAppliedControlHolding : nonAppliedControlHoldings){ entryHoldings.add(new EntryHolder(nonAppliedControlHolding.getDocumentHeader().getWorkflowDocument().getDateCreated().toDate(), nonAppliedControlHolding)); } if (entryHoldings.size() > 0) { Collections.sort(entryHoldings, entryHolderComparator); } List <NonAppliedHolding> results = new ArrayList<NonAppliedHolding>(); for (EntryHolder entryHolder : entryHoldings) { results.add((NonAppliedHolding) entryHolder.getHolder()); } return results; } public void setNonAppliedControlHoldings(List<NonAppliedHolding> nonAppliedControlHoldings) { this.nonAppliedControlHoldings = nonAppliedControlHoldings; } /** * Used for when the doc is final, to show the control docs section. * * @return */ public Map<String, KualiDecimal> getDistributionsFromControlDocs() { if (distributionsFromControlDocs == null || distributionsFromControlDocs.isEmpty()) { distributionsFromControlDocs = getPaymentApplicationDocument().getDistributionsFromControlDocuments(); } return distributionsFromControlDocs; } /** * Used for when the doc is live, to show the control docs section. * * @return */ public Map<String, KualiDecimal> getNonAppliedControlAllocations() { if (nonAppliedControlAllocations == null || nonAppliedControlAllocations.isEmpty()) { nonAppliedControlAllocations = getPaymentApplicationDocument().allocateFundsFromUnappliedControls(nonAppliedControlHoldings, getTotalApplied()); } return nonAppliedControlAllocations; } public void setNonAppliedControlAllocations(Map<String, KualiDecimal> nonAppliedControlAllocations) { this.nonAppliedControlAllocations = nonAppliedControlAllocations; } /** * @param documentNumber * @return */ public KualiDecimal getNonAppliedControlAllocation(String documentNumber) { if (!getNonAppliedControlAllocations().containsKey(documentNumber)) { return KualiDecimal.ZERO; } return getNonAppliedControlAllocations().get(documentNumber); } /** * @see org.kuali.rice.kns.web.struts.form.KualiTransactionalDocumentFormBase#populateFalseCheckboxes(javax.servlet.http.HttpServletRequest) */ @Override protected void populateFalseCheckboxes(HttpServletRequest request) { Map<String, String[]> parameterMap = request.getParameterMap(); if (parameterMap.get("checkboxToReset") != null) { final String[] checkboxesToReset = request.getParameterValues("checkboxToReset"); if(checkboxesToReset != null && checkboxesToReset.length > 0) { for (int i = 0; i < checkboxesToReset.length; i++) { String propertyName = checkboxesToReset[i]; if (!StringUtils.isBlank(propertyName) && parameterMap.get(propertyName) == null) { populateForProperty(propertyName, KimConstants.KIM_ATTRIBUTE_BOOLEAN_FALSE_STR_VALUE_DISPLAY, parameterMap); } else if (!StringUtils.isBlank(propertyName) && parameterMap.get(propertyName) != null && parameterMap.get(propertyName).length >= 1 && parameterMap.get(propertyName)[0].equalsIgnoreCase("on")) { populateForProperty(propertyName, KimConstants.KIM_ATTRIBUTE_BOOLEAN_TRUE_STR_VALUE_DISPLAY, parameterMap); } } } } } }