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.document.validation.impl;
017
018 import java.math.BigDecimal;
019
020 import org.kuali.kfs.module.endow.EndowConstants;
021 import org.kuali.kfs.module.endow.EndowKeyConstants;
022 import org.kuali.kfs.module.endow.EndowPropertyConstants;
023 import org.kuali.kfs.module.endow.businessobject.EndowmentTargetTransactionLine;
024 import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine;
025 import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionSecurity;
026 import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionTaxLotLine;
027 import org.kuali.kfs.module.endow.document.AssetIncreaseDocument;
028 import org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument;
029 import org.kuali.rice.kns.document.Document;
030
031 public class AssetIncreaseDocumentRules extends EndowmentTransactionLinesDocumentBaseRules {
032
033
034 /**
035 * @see org.kuali.rice.kns.rules.DocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.Document)
036 */
037 public boolean processCustomRouteDocumentBusinessRules(Document document) {
038 AssetIncreaseDocument assetIncreaseDoc = (AssetIncreaseDocument) document;
039 EndowmentTransactionSecurity endowmentTransactionSecurity = assetIncreaseDoc.getTargetTransactionSecurity();
040
041 // Validate at least one Tx was entered.
042 if (!transactionLineSizeGreaterThanZero(assetIncreaseDoc, false))
043 return false;
044
045 boolean isValid = super.processCustomRouteDocumentBusinessRules(document);
046
047 if (isValid) {
048
049
050 if (isSecurityCodeEmpty(assetIncreaseDoc, false)) {
051 return false;
052 }
053 if (!validateSecurityCode(assetIncreaseDoc, false)) {
054 return false;
055 }
056
057 // Checks if Security is Active
058 isValid &= isSecurityActive(assetIncreaseDoc, false);
059
060 if (isValid) {
061 isValid &= validateSecurityClassCodeTypeNotLiability(assetIncreaseDoc, false);
062 }
063
064 if (isRegistrationCodeEmpty(assetIncreaseDoc, false)) {
065 return false;
066 }
067 if (!validateRegistrationCode(assetIncreaseDoc, false)) {
068
069 return false;
070
071 }
072 // Checks if registration code is active
073 isValid &= isRegistrationCodeActive(assetIncreaseDoc, false);
074 }
075
076 if (isValid) {
077 isValid = validateTaxLotsCostAndTransactionAmountLessOrEqualToSecurityCommitment(assetIncreaseDoc);
078 }
079
080 return isValid;
081 }
082
083 /**
084 * @see org.kuali.kfs.module.endow.document.validation.impl.EndowmentTransactionLinesDocumentBaseRules#processAddTransactionLineRules(org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument,
085 * org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine)
086 */
087 @Override
088 public boolean processAddTransactionLineRules(EndowmentTransactionLinesDocument document, EndowmentTransactionLine line) {
089
090 AssetIncreaseDocument assetIncreaseDoc = (AssetIncreaseDocument) document;
091 EndowmentTransactionSecurity endowmentTransactionSecurity = assetIncreaseDoc.getTargetTransactionSecurity();
092 boolean isValid = super.processAddTransactionLineRules(document, line);
093
094 if (isValid) {
095
096 if (isSecurityCodeEmpty(assetIncreaseDoc, false)) {
097 return false;
098 }
099 if (!validateSecurityCode(assetIncreaseDoc, false)) {
100 return false;
101 }
102 if (isValid) {
103 isValid &= validateSecurityClassCodeTypeNotLiability(assetIncreaseDoc, false);
104 }
105
106 // Checks if Security is Active
107 isValid &= isSecurityActive(assetIncreaseDoc, false);
108 }
109
110 return isValid;
111 }
112
113 /**
114 * @see org.kuali.kfs.module.endow.document.validation.impl.EndowmentTransactionLinesDocumentBaseRules#validateTransactionLine(org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument,
115 * org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine, int)
116 */
117 @Override
118 protected boolean validateTransactionLine(EndowmentTransactionLinesDocument endowmentTransactionLinesDocument, EndowmentTransactionLine line, int index) {
119
120 boolean isValid = super.validateTransactionLine(endowmentTransactionLinesDocument, line, index);
121 EndowmentTargetTransactionLine targetTransactionLine = (EndowmentTargetTransactionLine) line;
122
123 AssetIncreaseDocument assetIncreaseDocument = (AssetIncreaseDocument) endowmentTransactionLinesDocument;
124
125 if (isSecurityCodeEmpty(assetIncreaseDocument, false))
126 return false;
127 if (!validateSecurityCode(assetIncreaseDocument, false))
128 return false;
129
130 isValid &= isSecurityActive(assetIncreaseDocument, false);
131 isValid &= validateSecurityClassCodeTypeNotLiability(assetIncreaseDocument, false);
132
133 if (isRegistrationCodeEmpty(assetIncreaseDocument, false))
134 return false;
135 if (!validateRegistrationCode(assetIncreaseDocument, false))
136 return false;
137
138 isValid &= isRegistrationCodeActive(assetIncreaseDocument, false);
139
140 isValid &= super.validateTransactionLine(endowmentTransactionLinesDocument, line, index);
141
142 if (isValid) {
143
144 isValid &= checkCashTransactionEndowmentCode(endowmentTransactionLinesDocument, targetTransactionLine, getErrorPrefix(targetTransactionLine, index));
145
146 if (endowmentTransactionLinesDocument.isErrorCorrectedDocument()) {
147 // Validate Amount is Less than Zero.
148 isValid &= validateTransactionAmountLessThanZero(line, getErrorPrefix(targetTransactionLine, index));
149
150 // Validate Units is Less than Zero.
151 isValid &= validateTransactionUnitsLessThanZero(line, getErrorPrefix(targetTransactionLine, index));
152 }
153 else {
154 // Validate Greater then Zero(thus positive) value
155 isValid &= validateTransactionAmountGreaterThanZero(line, getErrorPrefix(targetTransactionLine, index));
156
157 // Validate Units is Greater than Zero.
158 isValid &= validateTransactionUnitsGreaterThanZero(line, getErrorPrefix(targetTransactionLine, index));
159 }
160
161 isValid &= validateSecurityEtranChartMatch(endowmentTransactionLinesDocument, line, getErrorPrefix(targetTransactionLine, index), false);
162 }
163
164 return isValid;
165 }
166
167 /**
168 * If the SECURITY_ID has a class code type A (Alternative Investments), the system must validate that the total
169 * END_SEC_T: SEC_CVAL for the SECURITY_ID plus the END_TRAN_LN_T:TRAN_AMT does not exceed the value in END_SEC_T: CMTMNT_AMT
170 * for the Security. If it does, the transaction should not be allowed.
171 *
172 * @return true if valid, false otherwise
173 */
174 protected boolean validateTaxLotsCostAndTransactionAmountLessOrEqualToSecurityCommitment(AssetIncreaseDocument assetIncreaseDocument) {
175 boolean isValid = true;
176
177 if (assetIncreaseDocument.getTargetTransactionSecurity() != null && assetIncreaseDocument.getTargetTransactionSecurity().getSecurity() != null && assetIncreaseDocument.getTargetTransactionSecurity().getSecurity().getClassCode() != null && EndowConstants.ClassCodeTypes.ALTERNATIVE_INVESTMENT.equalsIgnoreCase(assetIncreaseDocument.getTargetTransactionSecurity().getSecurity().getClassCode().getClassCodeType())) {
178
179 BigDecimal totalTransactionLinesAmt = BigDecimal.ZERO;
180 BigDecimal securityCommitmentAmt = BigDecimal.ZERO;
181 BigDecimal securityCarryValue = BigDecimal.ZERO;
182
183 if (assetIncreaseDocument.getTargetTransactionLines() != null) {
184 for (EndowmentTransactionLine transactionLine : assetIncreaseDocument.getTargetTransactionLines()) {
185
186 // add to total amount
187 totalTransactionLinesAmt = totalTransactionLinesAmt.add(transactionLine.getTransactionAmount().bigDecimalValue());
188 }
189 }
190
191 if (assetIncreaseDocument.getTargetTransactionSecurity() != null && assetIncreaseDocument.getTargetTransactionSecurity().getSecurity() != null) {
192 if (assetIncreaseDocument.getTargetTransactionSecurity().getSecurity().getCommitmentAmount() != null) {
193 securityCommitmentAmt = assetIncreaseDocument.getTargetTransactionSecurity().getSecurity().getCommitmentAmount();
194 }
195 if (assetIncreaseDocument.getTargetTransactionSecurity().getSecurity().getCarryValue() != null) {
196 securityCarryValue = assetIncreaseDocument.getTargetTransactionSecurity().getSecurity().getCarryValue();
197 }
198 }
199
200 isValid = (securityCarryValue.add(totalTransactionLinesAmt)).compareTo(securityCommitmentAmt) <= 0;
201
202 if (!isValid) {
203 putFieldError(getErrorPrefix(assetIncreaseDocument.getTargetTransactionLine(0), 0) + EndowPropertyConstants.TRANSACTION_LINE_TRANSACTION_AMOUNT, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_TRANSACTION_SECURITY_COMMITMENT_AMT);
204 }
205 }
206
207 return isValid;
208 }
209 }