/*
* 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.purap.document.web.struts;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import org.kuali.kfs.module.purap.PurapConstants;
import org.kuali.kfs.module.purap.PurapParameterConstants;
import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine;
import org.kuali.kfs.module.purap.businessobject.PurApItem;
import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocument;
import org.kuali.kfs.module.purap.service.PurapAccountingService;
import org.kuali.kfs.module.purap.util.SummaryAccount;
import org.kuali.kfs.pdp.PdpPropertyConstants;
import org.kuali.kfs.pdp.businessobject.PurchasingPaymentDetail;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSParameterKeyConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.businessobject.AccountingLine;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
import org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase;
import org.kuali.rice.core.api.config.property.ConfigurationService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kns.web.ui.ExtraButton;
import org.kuali.rice.krad.util.KRADConstants;
import org.kuali.rice.krad.util.ObjectUtils;
import org.kuali.rice.krad.util.UrlFactory;
/**
* Struts Action Form for Purchasing and Accounts Payable documents.
*/
public class PurchasingAccountsPayableFormBase extends KualiAccountingDocumentFormBase {
protected transient List<SummaryAccount> summaryAccounts;
protected boolean readOnlyAccountDistributionMethod;
/**
* Constructs a PurchasingAccountsPayableFormBase instance and initializes summary accounts.
*/
public PurchasingAccountsPayableFormBase() {
super();
clearSummaryAccounts();
setupAccountDistributionMethod();
}
/**
* retrieves the system parameter value for account distribution method and determines
* if the drop-down box on the form should be read only or not.
*/
protected void setupAccountDistributionMethod() {
String defaultDistributionMethod = SpringContext.getBean(ParameterService.class).getParameterValueAsString(PurapConstants.PURAP_NAMESPACE, "Document", PurapParameterConstants.DISTRIBUTION_METHOD_FOR_ACCOUNTING_LINES);
if (PurapConstants.AccountDistributionMethodCodes.PROPORTIONAL_CODE.equalsIgnoreCase(defaultDistributionMethod) || PurapConstants.AccountDistributionMethodCodes.SEQUENTIAL_CODE.equalsIgnoreCase(defaultDistributionMethod)) {
this.setReadOnlyAccountDistributionMethod(true);
}
else {
this.setReadOnlyAccountDistributionMethod(false);
}
}
/**
* Updates the summaryAccounts that are contained in the form. Currently we are only calling this on load and when
* refreshAccountSummary is called.
*/
public void refreshAccountSummmary() {
clearSummaryAccounts();
PurchasingAccountsPayableDocument purapDocument = (PurchasingAccountsPayableDocument) getDocument();
summaryAccounts.addAll(SpringContext.getBean(PurapAccountingService.class).generateSummaryAccounts(purapDocument));
}
/**
* Initializes summary accounts.
*/
public void clearSummaryAccounts() {
summaryAccounts = new ArrayList<SummaryAccount>();
}
/**
* @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase#getBaselineSourceAccountingLines()
*/
public List getBaselineSourceAccountingLines() {
List<AccountingLine> accounts = new ArrayList<AccountingLine>();
if (ObjectUtils.isNull(accounts) || accounts.isEmpty()) {
accounts = new ArrayList<AccountingLine>();
for (PurApItem item : ((PurchasingAccountsPayableDocument) getDocument()).getItems()) {
List<PurApAccountingLine> lines = item.getBaselineSourceAccountingLines();
for (PurApAccountingLine line : lines) {
accounts.add(line);
}
}
}
return accounts;
}
@Override
public void populate(HttpServletRequest request) {
super.populate(request);
PurchasingAccountsPayableDocument purapDoc = (PurchasingAccountsPayableDocument)this.getDocument();
//fix document item/account references if necessary
purapDoc.fixItemReferences();
}
public List<SummaryAccount> getSummaryAccounts() {
if (summaryAccounts == null) {
refreshAccountSummmary();
}
return summaryAccounts;
}
public void setSummaryAccounts(List<SummaryAccount> summaryAccounts) {
this.summaryAccounts = summaryAccounts;
}
/**
* KRAD Conversion: Performs customization of an extra button.
*
* No data dictionary is involved.
*/
protected void addExtraButton(String property, String source, String altText) {
ExtraButton newButton = new ExtraButton();
newButton.setExtraButtonProperty(property);
newButton.setExtraButtonSource(source);
newButton.setExtraButtonAltText(altText);
extraButtons.add(newButton);
}
/**
* This method builds the url for the disbursement info on the purap documents.
* @return the disbursement info url
*/
public String getDisbursementInfoUrl() {
String basePath = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSConstants.APPLICATION_URL_KEY);
ParameterService parameterService = SpringContext.getBean(ParameterService.class);
String orgCode = parameterService.getParameterValueAsString(KfsParameterConstants.PURCHASING_BATCH.class, KFSParameterKeyConstants.PurapPdpParameterConstants.PURAP_PDP_ORG_CODE);
String subUnitCode = parameterService.getParameterValueAsString(KfsParameterConstants.PURCHASING_BATCH.class, KFSParameterKeyConstants.PurapPdpParameterConstants.PURAP_PDP_SUB_UNIT_CODE);
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.SEARCH_METHOD);
parameters.put(KFSConstants.BACK_LOCATION, basePath + "/" + KFSConstants.MAPPING_PORTAL + ".do");
parameters.put(KRADConstants.DOC_FORM_KEY, "88888888");
parameters.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, PurchasingPaymentDetail.class.getName());
parameters.put(KFSConstants.HIDE_LOOKUP_RETURN_LINK, "true");
parameters.put(KFSConstants.SUPPRESS_ACTIONS, "false");
parameters.put(PdpPropertyConstants.PaymentDetail.PAYMENT_UNIT_CODE, orgCode);
parameters.put(PdpPropertyConstants.PaymentDetail.PAYMENT_SUBUNIT_CODE, subUnitCode);
String lookupUrl = UrlFactory.parameterizeUrl(basePath + "/" + KFSConstants.LOOKUP_ACTION, parameters);
return lookupUrl;
}
/**
* overridden to make sure accounting lines on items are repopulated
* @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase#populateAccountingLinesForResponse(java.lang.String, java.util.Map)
*/
@Override
protected void populateAccountingLinesForResponse(String methodToCall, Map parameterMap) {
super.populateAccountingLinesForResponse(methodToCall, parameterMap);
populateItemAccountingLines(parameterMap);
}
/**
* Populates accounting lines for each item on the Purchasing AP document
* @param parameterMap the map of parameters
*/
protected void populateItemAccountingLines(Map parameterMap) {
int itemCount = 0;
for (PurApItem item : ((PurchasingAccountsPayableDocument)getDocument()).getItems()) {
populateAccountingLine(item.getNewSourceLine(), KFSPropertyConstants.DOCUMENT+"."+KFSPropertyConstants.ITEM+"["+itemCount+"]."+KFSPropertyConstants.NEW_SOURCE_LINE, parameterMap);
int sourceLineCount = 0;
for (PurApAccountingLine purApLine : item.getSourceAccountingLines()) {
populateAccountingLine(purApLine, KFSPropertyConstants.DOCUMENT+"."+KFSPropertyConstants.ITEM+"["+itemCount+"]."+KFSPropertyConstants.SOURCE_ACCOUNTING_LINE+"["+sourceLineCount+"]", parameterMap);
sourceLineCount += 1;
}
}
}
/**
* Gets the readOnlyAccountDistributionMethod attribute.
*
* @return Returns the readOnlyAccountDistributionMethod
*/
public boolean isReadOnlyAccountDistributionMethod() {
return readOnlyAccountDistributionMethod;
}
/**
* Sets the readOnlyAccountDistributionMethod attribute.
*
* @param readOnlyAccountDistributionMethod The readOnlyAccountDistributionMethod to set.
*/
public void setReadOnlyAccountDistributionMethod(boolean readOnlyAccountDistributionMethod) {
this.readOnlyAccountDistributionMethod = readOnlyAccountDistributionMethod;
}
}