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.endow.businessobject.lookup;
017
018 import java.math.BigDecimal;
019 import java.util.ArrayList;
020 import java.util.List;
021 import java.util.Map;
022
023 import org.kuali.kfs.module.endow.EndowPropertyConstants;
024 import org.kuali.kfs.module.endow.businessobject.TransactionArchive;
025 import org.kuali.rice.kns.bo.BusinessObject;
026 import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl;
027
028 public class TransactionArchiveLookupableHelperService extends KualiLookupableHelperServiceImpl {
029
030 /**
031 * @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResults(java.util.Map)
032 */
033 @Override
034 public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) {
035
036 // Initialize values.
037 BigDecimal greaterAmt = null;
038 BigDecimal lessAmt = null;
039
040 // Get the greater than and less than amounts.
041 try {
042 greaterAmt = new BigDecimal(fieldValues.remove(EndowPropertyConstants.TRANSACTION_ARCHIVE_GREATER_AMOUNT));
043 lessAmt = new BigDecimal(fieldValues.remove(EndowPropertyConstants.TRANSACTION_ARCHIVE_LESS_AMOUNT));
044 }
045 catch (NumberFormatException nfe) {}
046
047 List<TransactionArchive> transactionArchives = (List<TransactionArchive>)super.getSearchResults(fieldValues);
048 List<TransactionArchive> removalList = new ArrayList<TransactionArchive>();
049 for (TransactionArchive transactionArchive : transactionArchives) {
050
051 // Get principal and income amounts.
052 BigDecimal principalAmt = transactionArchive.getPrincipalCashAmount();
053 BigDecimal incomeAmt = transactionArchive.getIncomeCashAmount();
054
055 // Case 1: Equal to or greater than.
056 if (greaterAmt != null && lessAmt == null) {
057 if (!isPrincipalIncomeGreaterEqual(greaterAmt, principalAmt, incomeAmt)) {
058 removalList.add(transactionArchive);
059 }
060 }
061 // Case 2: Equal to or less than.
062 else if (greaterAmt == null && lessAmt != null) {
063 if (!isPrincipalIncomeLessEqual(lessAmt, principalAmt, incomeAmt)) {
064 removalList.add(transactionArchive);
065 }
066 }
067 // Case 3: Falls within in the range of greater than and less than, inclusive.
068 // Case 4: Value is exact.
069 else if (greaterAmt != null && lessAmt != null) {
070 // If both greater and less than values are the same, just check
071 // if either the principal or income value is equal to the
072 // greater/less amount.
073 if (greaterAmt.compareTo(lessAmt) == 0 &&
074 !isPrincipalIncomeEqual(lessAmt, principalAmt, incomeAmt)) {
075 removalList.add(transactionArchive);
076 }
077 // Check if either the income or principal value fall within the
078 // range of the greater and less than values.
079 else if (greaterAmt.compareTo(lessAmt) != 0 &&
080 !isPrincipalIncomeInRange(greaterAmt, lessAmt, principalAmt, incomeAmt)) {
081 removalList.add(transactionArchive);
082 }
083 }
084 }
085
086 // Remove items from the list.
087 transactionArchives.removeAll(removalList);
088
089 return transactionArchives;
090 }
091
092 /**
093 * Determines if either the principal or income amount is equal to the specified amount.
094 *
095 * @param amount
096 * @param principal
097 * @param income
098 * @return true if principal or income is equal to the specified amount
099 */
100 private boolean isPrincipalIncomeEqual(BigDecimal amount, BigDecimal principal, BigDecimal income) {
101 return (principal.compareTo(amount) == 0 || income.compareTo(amount) == 0);
102 }
103
104 /**
105 * Determines if the principal or income amount is within the specified range.
106 *
107 * @param greaterAmount
108 * @param lessAmount
109 * @param principal
110 * @param income
111 * @return true if the principal or income amount is within the greater and less than amount.
112 */
113 private boolean isPrincipalIncomeInRange(BigDecimal greaterAmount, BigDecimal lessAmount, BigDecimal principal, BigDecimal income) {
114
115 return (isPrincipalIncomeGreaterEqual(greaterAmount, principal, income) &&
116 isPrincipalIncomeLessEqual(lessAmount, principal, income));
117 }
118
119 /**
120 * Determines if the principal or income amount is less than or equal to the specified amount.
121 *
122 * @param amount
123 * @param principal
124 * @param income
125 * @return true if either the principal or income amounts are less than or equal to the specified amount.
126 */
127 private boolean isPrincipalIncomeLessEqual(BigDecimal amount, BigDecimal principal, BigDecimal income) {
128 return (principal.compareTo(amount) <= 0 || income.compareTo(amount) <= 0);
129 }
130
131 /**
132 * Determines if the principal or income amount is less than or equal to the specified amount.
133 *
134 * @param amount
135 * @param principal
136 * @param income
137 * @return true if either the principal or income amounts are greater than or equal to the specified amount.
138 */
139 private boolean isPrincipalIncomeGreaterEqual(BigDecimal amount, BigDecimal principal, BigDecimal income) {
140 return (principal.compareTo(amount) >= 0 || income.compareTo(amount) >= 0);
141 }
142
143 /**
144 * @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#allowsMaintenanceNewOrCopyAction()
145 */
146 @Override
147 public boolean allowsMaintenanceNewOrCopyAction() {
148
149 return false;
150 }
151
152 }