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 }