/* * 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.cab.businessobject; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.kuali.kfs.integration.purap.ItemCapitalAsset; import org.kuali.kfs.module.cab.CabConstants; import org.kuali.kfs.module.cab.CabPropertyConstants; import org.kuali.kfs.module.cab.document.service.PurApLineService; import org.kuali.kfs.module.cam.CamsPropertyConstants; import org.kuali.kfs.module.cam.businessobject.AssetGlobalDetail; import org.kuali.kfs.module.cam.businessobject.AssetPaymentAssetDetail; import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItemCapitalAsset; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.kns.service.DataDictionaryService; import org.kuali.rice.krad.bo.PersistableBusinessObjectBase; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.util.ObjectUtils; import org.kuali.rice.krad.util.UrlFactory; /** * @author Kuali Nervous System Team (kualidev@oncourse.iu.edu) */ public class PurchasingAccountsPayableItemAsset extends PersistableBusinessObjectBase implements Comparable<PurchasingAccountsPayableItemAsset> { private static final Logger LOG = Logger.getLogger(PurchasingAccountsPayableItemAsset.class); private String documentNumber; private Integer accountsPayableLineItemIdentifier; private Integer capitalAssetBuilderLineNumber; private String accountsPayableLineItemDescription; private KualiDecimal accountsPayableItemQuantity; private String capitalAssetManagementDocumentNumber; private String activityStatusCode; private PurchasingAccountsPayableDocument purchasingAccountsPayableDocument; private List<PurchasingAccountsPayableLineAssetAccount> purchasingAccountsPayableLineAssetAccounts; // non persistent fields private boolean active; private Integer itemLineNumber; private boolean additionalChargeNonTradeInIndicator; private boolean tradeInAllowance; private boolean itemAssignedToTradeInIndicator; private KualiDecimal unitCost; private KualiDecimal totalCost; private String firstFincialObjectCode; private KualiDecimal splitQty; private boolean selectedValue; private String itemTypeCode; private String lockingInformation; // used for Capital Asset Transaction private String capitalAssetTransactionTypeCode; private List<ItemCapitalAsset> purApItemAssets; private Integer capitalAssetSystemIdentifier; private Integer purchaseOrderItemIdentifier; // used to control "create asset" and "apply payment" button display private boolean createAssetIndicator; private boolean applyPaymentIndicator; private String preTagInquiryUrl; private List<Long> approvedAssetNumbers; private Integer paymentRequestIdentifier; public PurchasingAccountsPayableItemAsset() { this.purchasingAccountsPayableLineAssetAccounts = new ArrayList<PurchasingAccountsPayableLineAssetAccount>(); this.selectedValue = false; this.createAssetIndicator = false; this.applyPaymentIndicator = false; this.purApItemAssets = new ArrayList<ItemCapitalAsset>(); } // constructor used for split public PurchasingAccountsPayableItemAsset(PurchasingAccountsPayableItemAsset initialItemAsset) { this.documentNumber = initialItemAsset.documentNumber; this.accountsPayableLineItemIdentifier = initialItemAsset.getAccountsPayableLineItemIdentifier(); this.accountsPayableLineItemDescription = initialItemAsset.getAccountsPayableLineItemDescription(); this.itemLineNumber = initialItemAsset.getItemLineNumber(); this.firstFincialObjectCode = initialItemAsset.getFirstFincialObjectCode(); this.activityStatusCode = initialItemAsset.getActivityStatusCode(); this.tradeInAllowance = initialItemAsset.isTradeInAllowance(); this.itemAssignedToTradeInIndicator = initialItemAsset.isItemAssignedToTradeInIndicator(); this.additionalChargeNonTradeInIndicator = initialItemAsset.isAdditionalChargeNonTradeInIndicator(); this.purchasingAccountsPayableLineAssetAccounts = new ArrayList<PurchasingAccountsPayableLineAssetAccount>(); this.selectedValue = false; this.createAssetIndicator = initialItemAsset.isCreateAssetIndicator(); this.applyPaymentIndicator = initialItemAsset.isApplyPaymentIndicator(); this.purchaseOrderItemIdentifier = initialItemAsset.getPurchaseOrderItemIdentifier(); this.capitalAssetTransactionTypeCode = initialItemAsset.getCapitalAssetTransactionTypeCode(); this.purApItemAssets = new ArrayList<ItemCapitalAsset>(initialItemAsset.getPurApItemAssets()); this.capitalAssetSystemIdentifier = initialItemAsset.getCapitalAssetSystemIdentifier(); this.purchasingAccountsPayableDocument = initialItemAsset.getPurchasingAccountsPayableDocument(); this.lockingInformation = initialItemAsset.getLockingInformation(); } /** * Gets the lockingInformation attribute. * @return Returns the lockingInformation. */ public String getLockingInformation() { return lockingInformation; } /** * Sets the lockingInformation attribute value. * @param lockingInformation The lockingInformation to set. */ public void setLockingInformation(String lockingInformation) { this.lockingInformation = lockingInformation; } /** * Gets the capitalAssetSystemIdentifier attribute. * * @return Returns the capitalAssetSystemIdentifier. */ public Integer getCapitalAssetSystemIdentifier() { return capitalAssetSystemIdentifier; } /** * Sets the capitalAssetSystemIdentifier attribute value. * * @param capitalAssetSystemIdentifier The capitalAssetSystemIdentifier to set. */ public void setCapitalAssetSystemIdentifier(Integer capitalAssetSystemIdentifier) { this.capitalAssetSystemIdentifier = capitalAssetSystemIdentifier; } /** * Gets the purchaseOrderItemIdentifier attribute. * * @return Returns the purchaseOrderItemIdentifier. */ public Integer getPurchaseOrderItemIdentifier() { return purchaseOrderItemIdentifier; } /** * Sets the purchaseOrderItemIdentifier attribute value. * * @param purchaseOrderItemIdentifier The purchaseOrderItemIdentifier to set. */ public void setPurchaseOrderItemIdentifier(Integer purchaseOrderItemIdentifier) { this.purchaseOrderItemIdentifier = purchaseOrderItemIdentifier; } /** * Gets the capitalAssetNumbers attribute. * * @return Returns the capitalAssetNumbers. */ public List<ItemCapitalAsset> getPurApItemAssets() { return purApItemAssets; } /** * Sets the capitalAssetNumbers attribute value. * * @param capitalAssetNumbers The capitalAssetNumbers to set. */ public void setPurApItemAssets(List<ItemCapitalAsset> capitalAssetNumbers) { this.purApItemAssets = capitalAssetNumbers; } /** * Gets the capitalAssetNumbers attribute. * * @return Returns the capitalAssetNumbers. */ public ItemCapitalAsset getPurApItemAsset(int index) { while (getPurApItemAssets().size() <= index) { getPurApItemAssets().add(new PurchaseOrderItemCapitalAsset()); } return getPurApItemAssets().get(index); } /** * Gets the createAssetIndicator attribute. * * @return Returns the createAssetIndicator. */ public boolean isCreateAssetIndicator() { return createAssetIndicator; } /** * Sets the createAssetIndicator attribute value. * * @param createAssetIndicator The createAssetIndicator to set. */ public void setCreateAssetIndicator(boolean createAssetIndicator) { this.createAssetIndicator = createAssetIndicator; } /** * Gets the applyPaymentIndicator attribute. * * @return Returns the applyPaymentIndicator. */ public boolean isApplyPaymentIndicator() { return applyPaymentIndicator; } /** * Sets the applyPaymentIndicator attribute value. * * @param applyPaymentIndicator The applyPaymentIndicator to set. */ public void setApplyPaymentIndicator(boolean applyPaymentIndicator) { this.applyPaymentIndicator = applyPaymentIndicator; } /** * Gets the selectedValue attribute. * * @return Returns the selectedValue. */ public boolean isSelectedValue() { return selectedValue; } /** * Sets the selectedValue attribute value. * * @param selectedValue The selectedValue to set. */ public void setSelectedValue(boolean selectedValue) { this.selectedValue = selectedValue; } /** * Gets the itemTypeCode attribute. * * @return Returns the itemTypeCode. */ public String getItemTypeCode() { return itemTypeCode; } /** * Sets the itemTypeCode attribute value. * * @param itemTypeCode The itemTypeCode to set. */ public void setItemTypeCode(String itemTypeCode) { this.itemTypeCode = itemTypeCode; } /** * Gets the capitalAssetTransactionTypeCode attribute. * * @return Returns the capitalAssetTransactionTypeCode. */ public String getCapitalAssetTransactionTypeCode() { return capitalAssetTransactionTypeCode; } /** * Sets the capitalAssetTransactionTypeCode attribute value. * * @param capitalAssetTransactionTypeCode The capitalAssetTransactionTypeCode to set. */ public void setCapitalAssetTransactionTypeCode(String capitalAssetTransactionTypeCode) { this.capitalAssetTransactionTypeCode = capitalAssetTransactionTypeCode; } /** * Gets the additionalChargeNonTradeInIndicator attribute. * * @return Returns the additionalChargeNonTradeInIndicator. */ public boolean isAdditionalChargeNonTradeInIndicator() { return additionalChargeNonTradeInIndicator; } /** * Sets the additionalChargeNonTradeInIndicator attribute value. * * @param additionalChargeNonTradeInIndicator The additionalChargeNonTradeInIndicator to set. */ public void setAdditionalChargeNonTradeInIndicator(boolean additionalChargeNonTradeInIndicator) { this.additionalChargeNonTradeInIndicator = additionalChargeNonTradeInIndicator; } /** * Gets the tradeInAllowance attribute. * * @return Returns the tradeInAllowance. */ public boolean isTradeInAllowance() { return tradeInAllowance; } /** * Sets the tradeInAllowance attribute value. * * @param tradeInAllowance The tradeInAllowance to set. */ public void setTradeInAllowance(boolean tradeInAllowance) { this.tradeInAllowance = tradeInAllowance; } /** * Gets the splitQty attribute. * * @return Returns the splitQty. */ public KualiDecimal getSplitQty() { return splitQty; } /** * Sets the splitQty attribute value. * * @param splitQty The splitQty to set. */ public void setSplitQty(KualiDecimal splitQty) { this.splitQty = splitQty; } /** * Gets the purchasingAccountsPayableLineAssetAccounts attribute. * * @return Returns the purchasingAccountsPayableLineAssetAccounts. */ public List<PurchasingAccountsPayableLineAssetAccount> getPurchasingAccountsPayableLineAssetAccounts() { return purchasingAccountsPayableLineAssetAccounts; } /** * Sets the purchasingAccountsPayableLineAssetAccounts attribute value. * * @param purchasingAccountsPayableLineAssetAccounts The purchasingAccountsPayableLineAssetAccounts to set. */ public void setPurchasingAccountsPayableLineAssetAccounts(List<PurchasingAccountsPayableLineAssetAccount> purchasingAccountsPayableLineAssetAccounts) { this.purchasingAccountsPayableLineAssetAccounts = purchasingAccountsPayableLineAssetAccounts; } /** * Gets the documentNumber attribute. * * @return Returns the documentNumber. */ public String getDocumentNumber() { return documentNumber; } /** * Sets the documentNumber attribute value. * * @param documentNumber The documentNumber to set. */ public void setDocumentNumber(String documentNumber) { this.documentNumber = documentNumber; } /** * Gets the accountsPayableLineItemIdentifier attribute. * * @return Returns the accountsPayableLineItemIdentifier. */ public Integer getAccountsPayableLineItemIdentifier() { return accountsPayableLineItemIdentifier; } /** * Sets the accountsPayableLineItemIdentifier attribute value. * * @param accountsPayableLineItemIdentifier The accountsPayableLineItemIdentifier to set. */ public void setAccountsPayableLineItemIdentifier(Integer accountsPayableLineItemIdentifier) { this.accountsPayableLineItemIdentifier = accountsPayableLineItemIdentifier; } /** * Gets the accountsPayableLineItemDescription attribute. * * @return Returns the accountsPayableLineItemDescription. */ public String getAccountsPayableLineItemDescription() { return accountsPayableLineItemDescription; } /** * Sets the accountsPayableLineItemDescription attribute value. * * @param accountsPayableLineItemDescription The accountsPayableLineItemDescription to set. */ public void setAccountsPayableLineItemDescription(String accountsPayableLineItemDescription) { this.accountsPayableLineItemDescription = accountsPayableLineItemDescription; } /** * Gets the accountsPayableItemQuantity attribute. * * @return Returns the accountsPayableItemQuantity. */ public KualiDecimal getAccountsPayableItemQuantity() { return accountsPayableItemQuantity; } /** * Sets the accountsPayableItemQuantity attribute value. * * @param accountsPayableItemQuantity The accountsPayableItemQuantity to set. */ public void setAccountsPayableItemQuantity(KualiDecimal accountsPayableItemQuantity) { this.accountsPayableItemQuantity = accountsPayableItemQuantity; } /** * Gets the capitalAssetBuilderLineNumber attribute. * * @return Returns the capitalAssetBuilderLineNumber */ public Integer getCapitalAssetBuilderLineNumber() { return capitalAssetBuilderLineNumber; } /** * Sets the capitalAssetBuilderLineNumber attribute. * * @param capitalAssetBuilderLineNumber The capitalAssetBuilderLineNumber to set. */ public void setCapitalAssetBuilderLineNumber(Integer capitalAssetBuilderLineNumber) { this.capitalAssetBuilderLineNumber = capitalAssetBuilderLineNumber; } /** * Gets the capitalAssetManagementDocumentNumber attribute. * * @return Returns the capitalAssetManagementDocumentNumber */ public String getCapitalAssetManagementDocumentNumber() { return capitalAssetManagementDocumentNumber; } /** * Sets the capitalAssetManagementDocumentNumber attribute. * * @param capitalAssetManagementDocumentNumber The capitalAssetManagementDocumentNumber to set. */ public void setCapitalAssetManagementDocumentNumber(String capitalAssetManagementDocumentNumber) { this.capitalAssetManagementDocumentNumber = capitalAssetManagementDocumentNumber; } public Integer getItemLineNumber() { return itemLineNumber; } public void setItemLineNumber(Integer itemLineNumber) { this.itemLineNumber = itemLineNumber; } /** * @see org.kuali.rice.krad.bo.BusinessObjectBase#toStringMapper() */ protected LinkedHashMap toStringMapper_RICE20_REFACTORME() { LinkedHashMap m = new LinkedHashMap(); m.put("documentNumber", this.documentNumber); m.put("accountsPayableLineItemIdentifier", this.accountsPayableLineItemIdentifier); m.put("capitalAssetBuilderLineNumber", this.capitalAssetBuilderLineNumber); return m; } /** * Gets the active attribute. * * @return Returns the active. */ public boolean isActive() { return CabConstants.ActivityStatusCode.NEW.equalsIgnoreCase(this.getActivityStatusCode()) || CabConstants.ActivityStatusCode.MODIFIED.equalsIgnoreCase(this.getActivityStatusCode()); } /** * Gets the activityStatusCode attribute. * * @return Returns the activityStatusCode. */ public String getActivityStatusCode() { return activityStatusCode; } /** * Sets the activityStatusCode attribute value. * * @param activityStatusCode The activityStatusCode to set. */ public void setActivityStatusCode(String activityStatusCode) { this.activityStatusCode = activityStatusCode; } /** * Gets the purchasingAccountsPayableDocument attribute. * * @return Returns the purchasingAccountsPayableDocument. */ public PurchasingAccountsPayableDocument getPurchasingAccountsPayableDocument() { return purchasingAccountsPayableDocument; } /** * Sets the purchasingAccountsPayableDocument attribute value. * * @param purchasingAccountsPayableDocument The purchasingAccountsPayableDocument to set. */ public void setPurchasingAccountsPayableDocument(PurchasingAccountsPayableDocument purchasingAccountsPayableDocument) { this.purchasingAccountsPayableDocument = purchasingAccountsPayableDocument; } /** * Gets the itemAssignedToTradeInIndicator attribute. * * @return Returns the itemAssignedToTradeInIndicator. */ public boolean isItemAssignedToTradeInIndicator() { return itemAssignedToTradeInIndicator; } /** * Sets the itemAssignedToTradeInIndicator attribute value. * * @param itemAssignedToTradeInIndicator The itemAssignedToTradeInIndicator to set. */ public void setItemAssignedToTradeInIndicator(boolean itemAssignedToTradeInIndicator) { this.itemAssignedToTradeInIndicator = itemAssignedToTradeInIndicator; } /** * Gets the unitCost attribute. * * @return Returns the unitCost. */ public KualiDecimal getUnitCost() { return unitCost; } /** * Sets the unitCost attribute value. * * @param unitCost The unitCost to set. */ public void setUnitCost(KualiDecimal unitCost) { this.unitCost = unitCost; } /** * Gets the totalCost attribute. * * @return Returns the totalCost. */ public KualiDecimal getTotalCost() { return totalCost; } /** * Sets the totalCost attribute value. * * @param totalCost The totalCost to set. */ public void setTotalCost(KualiDecimal totalCost) { this.totalCost = totalCost; } /** * Gets the firstFincialObjectCode attribute. * * @return Returns the firstFincialObjectCode. */ public String getFirstFincialObjectCode() { return firstFincialObjectCode; } /** * Sets the firstFincialObjectCode attribute value. * * @param firstFincialObjectCode The firstFincialObjectCode to set. */ public void setFirstFincialObjectCode(String firstFincialObjectCode) { this.firstFincialObjectCode = firstFincialObjectCode; } public String getPreTagInquiryUrl() { if (StringUtils.isNotBlank(this.preTagInquiryUrl)) { return preTagInquiryUrl; } if (ObjectUtils.isNotNull(this.getPurchasingAccountsPayableDocument())) { Integer purchaseOrderIdentifier = this.getPurchasingAccountsPayableDocument().getPurchaseOrderIdentifier(); PurApLineService purApLineService = SpringContext.getBean(PurApLineService.class); if (purApLineService.isPretaggingExisting(purApLineService.getPreTagLineItem(purchaseOrderIdentifier, this.getItemLineNumber()))) { String baseUrl = KFSConstants.INQUIRY_ACTION; Properties parameters = new Properties(); parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.START_METHOD); parameters.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, Pretag.class.getName()); parameters.put(CabPropertyConstants.Pretag.PURCHASE_ORDER_NUMBER, purchaseOrderIdentifier.toString()); parameters.put(CabPropertyConstants.Pretag.ITEM_LINE_NUMBER, this.getItemLineNumber().toString()); this.preTagInquiryUrl = UrlFactory.parameterizeUrl(baseUrl, parameters); return this.preTagInquiryUrl; } } return ""; } /** * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(PurchasingAccountsPayableItemAsset o) { boolean o1ItemTypeBelowTheLine = this.isAdditionalChargeNonTradeInIndicator() || this.isTradeInAllowance(); boolean o2ItemTypeBelowTheLine = o.isAdditionalChargeNonTradeInIndicator() || o.isTradeInAllowance(); if (o1ItemTypeBelowTheLine && !o2ItemTypeBelowTheLine) { return 1; } else if (o2ItemTypeBelowTheLine && !o1ItemTypeBelowTheLine) { return -1; } return 0; } /** * Gets the approvedAssetNumbers attribute. * * @return Returns the approvedAssetNumbers. */ public List<Long> getApprovedAssetNumbers() { if (this.approvedAssetNumbers != null && !this.approvedAssetNumbers.isEmpty()) { return this.approvedAssetNumbers; } else { this.approvedAssetNumbers = new ArrayList<Long>(); if (!StringUtils.isEmpty(this.getCapitalAssetManagementDocumentNumber())) { Map<String, String> fieldValues = new HashMap<String, String>(); if (CabConstants.ActivityStatusCode.PROCESSED_IN_CAMS.equalsIgnoreCase(this.getActivityStatusCode())) { // get asset number from asset global add doc fieldValues.put(CamsPropertyConstants.AssetGlobalDetail.DOCUMENT_NUMBER, this.getCapitalAssetManagementDocumentNumber()); Collection<AssetGlobalDetail> assetGlobalDetails = SpringContext.getBean(BusinessObjectService.class).findMatching(AssetGlobalDetail.class, fieldValues); for (AssetGlobalDetail detail : assetGlobalDetails) { this.approvedAssetNumbers.add(detail.getCapitalAssetNumber()); } if (assetGlobalDetails.isEmpty()) { // get asset number from asset payment doc fieldValues.clear(); fieldValues.put(CamsPropertyConstants.DOCUMENT_NUMBER, this.getCapitalAssetManagementDocumentNumber()); Collection<AssetPaymentAssetDetail> paymentAssetDetails = SpringContext.getBean(BusinessObjectService.class).findMatching(AssetPaymentAssetDetail.class, fieldValues); for (AssetPaymentAssetDetail detail : paymentAssetDetails) { this.approvedAssetNumbers.add(detail.getCapitalAssetNumber()); } } } } return this.approvedAssetNumbers; } } private DataDictionaryService getDataDictionaryService() { return SpringContext.getBean(DataDictionaryService.class); } public PurchasingAccountsPayableLineAssetAccount getPurchasingAccountsPayableLineAssetAccount(int index) { int size = getPurchasingAccountsPayableLineAssetAccounts().size(); while (size <= index || getPurchasingAccountsPayableLineAssetAccounts().get(index) == null) { getPurchasingAccountsPayableLineAssetAccounts().add(size++, new PurchasingAccountsPayableLineAssetAccount()); } return getPurchasingAccountsPayableLineAssetAccounts().get(index); } /** * Gets the paymentRequestIdentifier attribute. * @return Returns the paymentRequestIdentifier. */ public Integer getPaymentRequestIdentifier() { return paymentRequestIdentifier; } /** * Sets the paymentRequestIdentifier attribute value. * @param paymentRequestIdentifier The paymentRequestIdentifier to set. */ public void setPaymentRequestIdentifier(Integer paymentRequestIdentifier) { this.paymentRequestIdentifier = paymentRequestIdentifier; } /** * KFSCNTRB-1676/FSKD-5487 * Returns true if it is an active TRDI additional charge asset line. */ public boolean isActiveAdditionalTRDI() { return isTradeInAllowance() && isActive(); } /** * KFSCNTRB-1676/FSKD-5487 * Returns true if it is an active non-TRDI additional charge asset line. */ public boolean isActiveAdditionalNonTRDI() { return isAdditionalChargeNonTradeInIndicator() && isActive(); } /** * KFSCNTRB-1676/FSKD-5487 * Returns true if it is an active trade-in ITEM asset line. */ public boolean isActiveItemTradeIn() { return !isAdditionalChargeNonTradeInIndicator() && !isTradeInAllowance() && isItemAssignedToTradeInIndicator() && isActive(); } /** * KFSCNTRB-1676/FSKD-5487 * Returns true if it is an active ITEM asset line. */ public boolean isActiveItemLine() { return !isAdditionalChargeNonTradeInIndicator() && !isTradeInAllowance() && isActive(); } }