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.purap.businessobject;
017
018 import java.math.BigDecimal;
019
020 import org.apache.commons.lang.StringUtils;
021 import org.kuali.kfs.integration.cab.CapitalAssetBuilderAssetTransactionType;
022 import org.kuali.kfs.module.purap.PurapPropertyConstants;
023 import org.kuali.kfs.module.purap.util.PurApItemUtils;
024 import org.kuali.kfs.sys.context.SpringContext;
025 import org.kuali.rice.kns.service.KualiModuleService;
026 import org.kuali.rice.kns.util.KualiDecimal;
027 import org.kuali.rice.kns.util.ObjectUtils;
028
029 /**
030 * Base class for Accounts Payable Item Business Objects.
031 */
032 public abstract class AccountsPayableItemBase extends PurApItemBase implements AccountsPayableItem {
033 private KualiDecimal extendedPrice;
034 private String capitalAssetTransactionTypeCode;
035 private CapitalAssetBuilderAssetTransactionType capitalAssetTransactionType;
036
037 /**
038 * Method defaults to {@link #isConsideredEnteredWithZero()}
039 *
040 * @see org.kuali.module.purap.bo.PurchasingApItem#isConsideredEntered()
041 */
042 public boolean isConsideredEntered() {
043 return isConsideredEnteredWithZero();
044 }
045
046 public boolean isEligibleDisplay() {
047 return isConsideredEnteredWithZero();
048 }
049
050 public boolean isConsideredEnteredWithZero() {
051 return isConsideredEntered(true);
052 }
053
054 public boolean isConsideredEnteredWithoutZero() {
055 return isConsideredEntered(false);
056 }
057
058 /**
059 * This method is used to determine whether an item has been entered that is we are satisfied there's enough info to continue
060 * processing that particular item. It is currently used by the rules class to determine when it's necessary to run rules on
061 * items (so that lines processors don't touch won't be validated) and to determine when to show items (in combination with the
062 * full entry mode)
063 *
064 * @param allowsZero if this is true zero will be considered the same as null.
065 * @return true if the item is considered entered false otherwise
066 */
067 private boolean isConsideredEntered(boolean allowsZero) {
068 if (getItemType().isLineItemIndicator()) {
069 if ((getItemType().isQuantityBasedGeneralLedgerIndicator())) {
070 if ((ObjectUtils.isNull(getItemQuantity())) && (ObjectUtils.isNull(getExtendedPrice()) || (allowsZero && getExtendedPrice().isZero()))) {
071 return false;
072 }
073 }
074 else {
075 if (ObjectUtils.isNull(getExtendedPrice()) || (allowsZero && getExtendedPrice().isZero())) {
076 return false;
077 }
078 }
079 }
080 else {
081 if ((ObjectUtils.isNull(getItemUnitPrice()) || (allowsZero && this.getItemUnitPrice().compareTo(new BigDecimal(0)) == 0)) && (StringUtils.isBlank(getItemDescription()))) {
082 return false;
083 }
084 }
085
086 return true;
087 }
088
089 public boolean isNonZeroAmount() {
090 return PurApItemUtils.isNonZeroExtended(this);
091 }
092
093 /**
094 * Gets the extendedPrice attribute. this override is necessary because extended price needs to be set based on the unit price
095 * for below the line(without this it would always be empty)
096 *
097 * @return Returns the extendedPrice.
098 */
099 @Override
100 public KualiDecimal getExtendedPrice() {
101 if (ObjectUtils.isNotNull(this.getItemUnitPrice()) && this.getItemType().isAmountBasedGeneralLedgerIndicator()) {
102 if (ObjectUtils.isNotNull(this.getItemUnitPrice())) {
103 extendedPrice = new KualiDecimal(this.getItemUnitPrice().toString());
104 }else{
105 extendedPrice = null;
106 }
107 }else if (ObjectUtils.isNull(this.getItemUnitPrice()) &&
108 this.getItemType().isAmountBasedGeneralLedgerIndicator() &&
109 this.getItemType().isAdditionalChargeIndicator()){ // This additional charges check is needed since non qty items also dont have unit price
110 // extendedPrice should be null if the unit price is null
111 extendedPrice = null;
112 }
113 return extendedPrice;
114 }
115
116 public void setExtendedPrice(KualiDecimal extendedPrice) {
117 this.extendedPrice = extendedPrice;
118 }
119
120 /**
121 * Override the method in PurApItemBase so that if the item is
122 * not eligible to be displayed in the account summary tab,
123 * which is if the item's extended price is null or zero,
124 * we'll return null and the item won't be added
125 * to the list of account summary.
126 *
127 * @see org.kuali.kfs.module.purap.businessobject.PurApItemBase#getSummaryItem()
128 */
129 @Override
130 public PurApSummaryItem getSummaryItem() {
131 if (extendedPrice == null || extendedPrice.intValue() == 0) {
132 return null;
133 }
134 else {
135 return super.getSummaryItem();
136 }
137 }
138
139 public String getCapitalAssetTransactionTypeCode() {
140 return capitalAssetTransactionTypeCode;
141 }
142
143 public void setCapitalAssetTransactionTypeCode(String capitalAssetTransactionTypeCode) {
144 this.capitalAssetTransactionTypeCode = capitalAssetTransactionTypeCode;
145 }
146
147 public CapitalAssetBuilderAssetTransactionType getCapitalAssetTransactionType() {
148 return capitalAssetTransactionType = (CapitalAssetBuilderAssetTransactionType) SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(CapitalAssetBuilderAssetTransactionType.class).retrieveExternalizableBusinessObjectIfNecessary(this, capitalAssetTransactionType, PurapPropertyConstants.ITEM_CAPITAL_ASSET_TRANSACTION_TYPE);
149 }
150
151 public void setItemDescription(String itemDescription) {
152 if((itemDescription != null) && (itemDescription.length() > 100))
153 {
154 super.setItemDescription(itemDescription.substring(0, 100));
155 } else
156 {
157 super.setItemDescription(itemDescription);
158 }
159
160 }
161
162 }