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    }