/*
* 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.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts.upload.FormFile;
import org.kuali.kfs.integration.purap.CapitalAssetLocation;
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.PurApAccountingLineBase;
import org.kuali.kfs.module.purap.businessobject.PurApItem;
import org.kuali.kfs.module.purap.document.PurchasingDocument;
import org.kuali.kfs.sys.KFSConstants;
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.rice.core.api.config.property.ConfigurationService;
import org.kuali.rice.core.web.format.PhoneNumberFormatter;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kns.web.ui.ExtraButton;
import org.kuali.rice.krad.util.KRADConstants;
/**
* Struts Action Form for Purchasing documents.
*/
public abstract class PurchasingFormBase extends PurchasingAccountsPayableFormBase {
protected Boolean notOtherDeliveryBuilding = true;
protected Boolean hideDistributeAccounts = true;
protected PurApItem newPurchasingItemLine;
protected FormFile itemImportFile; // file from which items can be imported
protected String distributePurchasingCommodityCode;
protected String distributePurchasingCommodityDescription;
protected boolean calculated;
protected String initialZipCode;
// *** Note that the following variables do not use camel caps ON PURPOSE, because of how the accounting lines tag uses the
// accountPrefix
protected Integer accountDistributionnextSourceLineNumber;
protected List<PurApAccountingLine> accountDistributionsourceAccountingLines;
protected PurApAccountingLine accountDistributionnewSourceLine;
protected CapitalAssetLocation newPurchasingCapitalAssetLocationLine;
protected BigDecimal totalPercentageOfAccountDistributionsourceAccountingLines;
protected String locationBuildingFromLookup;
protected String locationCampusFromLookup;
/**
* Constructs a PurchasingFormBase instance and sets up the appropriately casted document.
*/
public PurchasingFormBase() {
super();
this.setNewPurchasingItemLine(setupNewPurchasingItemLine());
newPurchasingItemLine.setItemTypeCode("ITEM");
this.accountDistributionnextSourceLineNumber = new Integer(1);
setAccountDistributionsourceAccountingLines(new ArrayList());
this.setAccountDistributionnewSourceLine(setupNewAccountDistributionAccountingLine());
this.setNewPurchasingCapitalAssetLocationLine(this.setupNewPurchasingCapitalAssetLocationLine());
setFormatterType("document.vendorFaxNumber",PhoneNumberFormatter.class);
calculated = false;
}
public Boolean getNotOtherDeliveryBuilding() {
return notOtherDeliveryBuilding;
}
public void setNotOtherDeliveryBuilding(Boolean notOtherDeliveryBuilding) {
this.notOtherDeliveryBuilding = notOtherDeliveryBuilding;
}
public Boolean getHideDistributeAccounts() {
return hideDistributeAccounts;
}
public void setHideDistributeAccounts(Boolean hideDistributeAccounts) {
this.hideDistributeAccounts = hideDistributeAccounts;
}
public Integer getAccountDistributionnextSourceLineNumber() {
return accountDistributionnextSourceLineNumber;
}
public void setAccountDistributionnextSourceLineNumber(Integer accountDistributionnextSourceLineNumber) {
this.accountDistributionnextSourceLineNumber = accountDistributionnextSourceLineNumber;
}
public List<PurApAccountingLine> getAccountDistributionsourceAccountingLines() {
return accountDistributionsourceAccountingLines;
}
public void setAccountDistributionsourceAccountingLines(List<PurApAccountingLine> accountDistributionAccountingLines) {
this.accountDistributionsourceAccountingLines = accountDistributionAccountingLines;
}
public BigDecimal getTotalPercentageOfAccountDistributionsourceAccountingLines() {
this.totalPercentageOfAccountDistributionsourceAccountingLines = new BigDecimal(0);
for (PurApAccountingLine line : this.getAccountDistributionsourceAccountingLines()) {
if (line.getAccountLinePercent() != null) {
setTotalPercentageOfAccountDistributionsourceAccountingLines(this.totalPercentageOfAccountDistributionsourceAccountingLines.add(line.getAccountLinePercent()));
}
}
return this.totalPercentageOfAccountDistributionsourceAccountingLines;
}
public void setTotalPercentageOfAccountDistributionsourceAccountingLines(BigDecimal total) {
this.totalPercentageOfAccountDistributionsourceAccountingLines = total;
}
public PurApAccountingLine getAccountDistributionnewSourceLine() {
return accountDistributionnewSourceLine;
}
public void setAccountDistributionnewSourceLine(PurApAccountingLine accountDistributionnewSourceLine) {
this.accountDistributionnewSourceLine = accountDistributionnewSourceLine;
}
public PurApItem getNewPurchasingItemLine() {
return newPurchasingItemLine;
}
public void setNewPurchasingItemLine(PurApItem newPurchasingItemLine) {
this.newPurchasingItemLine = newPurchasingItemLine;
}
public FormFile getItemImportFile() {
return itemImportFile;
}
public void setItemImportFile(FormFile itemImportFile) {
this.itemImportFile = itemImportFile;
}
/**
* Returns the Account Distribution Source Accounting Line at the specified index.
*
* @param index the index of the Account Distribution Source Accounting Line.
* @return the specified Account Distribution Source Accounting Line.
*/
public PurApAccountingLine getAccountDistributionsourceAccountingLine(int index) {
while (accountDistributionsourceAccountingLines.size() <= index) {
accountDistributionsourceAccountingLines.add(setupNewAccountDistributionAccountingLine());
}
return accountDistributionsourceAccountingLines.get(index);
}
/**
* Returns the new Purchasing Item Line and resets it to null.
*
* @return the new Purchasing Item Line.
*/
public PurApItem getAndResetNewPurchasingItemLine() {
PurApItem aPurchasingItemLine = getNewPurchasingItemLine();
setNewPurchasingItemLine(setupNewPurchasingItemLine());
return aPurchasingItemLine;
}
/**
* This method should be overriden (or see accountingLines for an alternate way of doing this with newInstance)
*/
public PurApItem setupNewPurchasingItemLine() {
return null;
}
/**
* This method should be overriden (or see accountingLines for an alternate way of doing this with newInstance)
*/
public PurApAccountingLineBase setupNewPurchasingAccountingLine() {
return null;
}
/**
* This method should be overriden.
*/
public PurApAccountingLineBase setupNewAccountDistributionAccountingLine() {
return null;
}
/**
* Sets the sequence number appropriately for the passed in source accounting line using the value that has been stored in the
* nextSourceLineNumber variable, adds the accounting line to the list that is aggregated by this object, and then handles
* incrementing the nextSourceLineNumber variable.
*
* @param line the accounting line to add to the list.
* @see org.kuali.kfs.sys.document.AccountingDocument#addSourceAccountingLine(SourceAccountingLine)
*/
public void addAccountDistributionsourceAccountingLine(PurApAccountingLine line) {
line.setSequenceNumber(this.getAccountDistributionnextSourceLineNumber());
this.accountDistributionsourceAccountingLines.add(line);
this.accountDistributionnextSourceLineNumber = new Integer(this.getAccountDistributionnextSourceLineNumber().intValue() + 1);
this.setAccountDistributionnewSourceLine(setupNewAccountDistributionAccountingLine());
}
public String getDistributePurchasingCommodityCode() {
return distributePurchasingCommodityCode;
}
public void setDistributePurchasingCommodityCode(String distributePurchasingCommodityCode) {
this.distributePurchasingCommodityCode = distributePurchasingCommodityCode;
}
public String getDistributePurchasingCommodityDescription() {
return distributePurchasingCommodityDescription;
}
public void setDistributePurchasingCommodityDescription(String distributePurchasingCommodityDescription) {
this.distributePurchasingCommodityDescription = distributePurchasingCommodityDescription;
}
public Class getItemCapitalAssetClass(){
return null;
}
public Class getCapitalAssetLocationClass(){
return null;
}
//CAMS LOCATION
//Must be overridden
public CapitalAssetLocation setupNewPurchasingCapitalAssetLocationLine() {
CapitalAssetLocation location = null;
try{
location = (CapitalAssetLocation)getCapitalAssetLocationClass().newInstance();
}
catch (InstantiationException e) {
throw new RuntimeException("Unable to get class");
}
catch (IllegalAccessException e) {
throw new RuntimeException("Unable to get class");
}
catch (NullPointerException e) {
throw new RuntimeException("Can't instantiate Purchasing Account from base");
}
return location;
}
public void setNewPurchasingCapitalAssetLocationLine(CapitalAssetLocation newCapitalAssetLocationLine) {
this.newPurchasingCapitalAssetLocationLine = newCapitalAssetLocationLine;
}
public CapitalAssetLocation getNewPurchasingCapitalAssetLocationLine() {
return newPurchasingCapitalAssetLocationLine;
}
public CapitalAssetLocation getAndResetNewPurchasingCapitalAssetLocationLine() {
CapitalAssetLocation assetLocation = getNewPurchasingCapitalAssetLocationLine();
setNewPurchasingCapitalAssetLocationLine(setupNewPurchasingCapitalAssetLocationLine());
return assetLocation;
}
public void resetNewPurchasingCapitalAssetLocationLine() {
setNewPurchasingCapitalAssetLocationLine(setupNewPurchasingCapitalAssetLocationLine());
}
//Availability once
public String getPurchasingItemCapitalAssetAvailability(){
String availability = PurapConstants.CapitalAssetAvailability.NONE;
PurchasingDocument pd = (PurchasingDocument)this.getDocument();
if( (PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.MODIFY.equals(pd.getCapitalAssetSystemStateCode())) ||
(PurapConstants.CapitalAssetSystemTypes.MULTIPLE.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.MODIFY.equals(pd.getCapitalAssetSystemStateCode())) ){
availability = PurapConstants.CapitalAssetAvailability.ONCE;
}else if((PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.MODIFY.equals(pd.getCapitalAssetSystemStateCode()))){
availability = PurapConstants.CapitalAssetAvailability.EACH;
}
return availability;
}
public String getPurchasingCapitalAssetSystemAvailability(){
String availability = PurapConstants.CapitalAssetAvailability.NONE;
PurchasingDocument pd = (PurchasingDocument)this.getDocument();
if( (PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode())) ){
availability = PurapConstants.CapitalAssetAvailability.ONCE;
}else if((PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode()))){
availability = PurapConstants.CapitalAssetAvailability.EACH;
}
return availability;
}
public String getPurchasingCapitalAssetSystemCommentsAvailability(){
String availability = PurapConstants.CapitalAssetAvailability.NONE;
PurchasingDocument pd = (PurchasingDocument)this.getDocument();
if( (PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) || PurapConstants.CapitalAssetSystemTypes.MULTIPLE.equals(pd.getCapitalAssetSystemTypeCode())) ){
availability = PurapConstants.CapitalAssetAvailability.ONCE;
}else if(PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL.equals(pd.getCapitalAssetSystemTypeCode()) ){
availability = PurapConstants.CapitalAssetAvailability.EACH;
}
return availability;
}
public String getPurchasingCapitalAssetSystemDescriptionAvailability(){
String availability = PurapConstants.CapitalAssetAvailability.NONE;
PurchasingDocument pd = (PurchasingDocument)this.getDocument();
if( (PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode())) ||
(PurapConstants.CapitalAssetSystemTypes.MULTIPLE.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode())) ){
availability = PurapConstants.CapitalAssetAvailability.ONCE;
}
return availability;
}
public String getPurchasingCapitalAssetLocationAvailability() {
String availability = PurapConstants.CapitalAssetAvailability.NONE;
PurchasingDocument pd = (PurchasingDocument) this.getDocument();
if ((PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode()))) {
availability = PurapConstants.CapitalAssetAvailability.ONCE;
}
else if ((PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode()))) {
availability = PurapConstants.CapitalAssetAvailability.EACH;
}
return availability;
}
public String getPurchasingCapitalAssetCountAssetNumberAvailability() {
String availability = PurapConstants.CapitalAssetAvailability.NONE;
PurchasingDocument pd = (PurchasingDocument) this.getDocument();
if ((PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode()))) {
availability = PurapConstants.CapitalAssetAvailability.ONCE;
}
return availability;
}
/**
* KRAD Conversion: Performs customization of an extra buttons.
*
* No data dictionary is involved.
*/
@Override
public List<ExtraButton> getExtraButtons() {
extraButtons.clear();
String appExternalImageURL = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSConstants.EXTERNALIZABLE_IMAGES_URL_KEY);
// add the calculate button if the user can edit
if (canUserCalculate()) {
addExtraButton("methodToCall.calculate", appExternalImageURL + "buttonsmall_calculate.gif", "Calculate");
}
return extraButtons;
}
public String getLocationBuildingFromLookup() {
return locationBuildingFromLookup;
}
public void setLocationBuildingFromLookup(String locationBuildingFromLookup) {
this.locationBuildingFromLookup = locationBuildingFromLookup;
}
public String getLocationCampusFromLookup() {
return locationCampusFromLookup;
}
public void setLocationCampusFromLookup(String locationCampusFromLookup) {
this.locationCampusFromLookup = locationCampusFromLookup;
}
public String getInitialZipCode() {
return initialZipCode;
}
public void setInitialZipCode(String initialZipCode) {
this.initialZipCode = initialZipCode;
}
public boolean isCalculated() {
return calculated;
}
public void setCalculated(boolean calculated) {
this.calculated = calculated;
}
public boolean canUserCalculate(){
return documentActions != null && documentActions.containsKey(KRADConstants.KUALI_ACTION_CAN_EDIT);
}
/**
* @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase#repopulateOverrides(org.kuali.kfs.sys.businessobject.AccountingLine, java.lang.String, java.util.Map)
*/
@Override
protected void repopulateOverrides(AccountingLine line, String accountingLinePropertyName, Map parameterMap) {
// do nothing; purchasing documents do not have overrides
}
/**
* @return the URL to the line item import instructions
*/
public String getLineItemImportInstructionsUrl() {
return SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSConstants.EXTERNALIZABLE_HELP_URL_KEY) + SpringContext.getBean(ParameterService.class).getParameterValueAsString(KfsParameterConstants.PURCHASING_DOCUMENT.class, PurapParameterConstants.LINE_ITEM_IMPORT);
}
}