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.util.ArrayList;
019 import java.util.List;
020
021 import org.kuali.kfs.module.endow.EndowKeyConstants;
022 import org.kuali.kfs.module.endow.businessobject.EndowmentSourceTransactionLine;
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.EndowmentTransactionTaxLotLine;
026 import org.kuali.kfs.module.endow.document.EndowmentSecurityDetailsDocument;
027 import org.kuali.kfs.module.endow.document.EndowmentTaxLotLinesDocument;
028 import org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument;
029 import org.kuali.kfs.module.endow.document.SecurityTransferDocument;
030 import org.kuali.kfs.module.endow.document.validation.DeleteTaxLotLineRule;
031 import org.kuali.rice.kns.document.Document;
032 import org.kuali.rice.kns.util.GlobalVariables;
033
034 public class SecurityTransferDocumentRules extends EndowmentTransactionLinesDocumentBaseRules implements DeleteTaxLotLineRule<EndowmentTaxLotLinesDocument, EndowmentTransactionTaxLotLine, EndowmentTransactionLine, Number, Number> {
035
036
037 /**
038 * @see org.kuali.kfs.module.endow.document.validation.AddTransactionLineRule#processAddTransactionLineRules(org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument,
039 * org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine)
040 */
041 @Override
042 public boolean processAddTransactionLineRules(EndowmentTransactionLinesDocument transLineDocument, EndowmentTransactionLine line) {
043 boolean isValid = true;
044
045 SecurityTransferDocument securityTransferDocument = (SecurityTransferDocument) transLineDocument;
046
047 isValid &= validateSecurity(isValid, securityTransferDocument, true);
048
049 isValid &= validateRegistration(isValid, securityTransferDocument, true);
050
051 // if adding a target transaction line check that there is at least one source transaction line entered
052 if (line instanceof EndowmentTargetTransactionLine) {
053 if (transLineDocument.getSourceTransactionLines() == null || transLineDocument.getSourceTransactionLines().size() == 0) {
054 putFieldError(getErrorPrefix(line, -1), EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_SECURITY_TRANSFER_ENTER_SOURCE_TRANS_LINE);
055 return false;
056 }
057 }
058
059 // there can be only one source transaction line
060 isValid &= validateOnlyOneSourceTransactionLine(true, securityTransferDocument, line, -1);
061
062 if (isValid) {
063 isValid &= super.processAddTransactionLineRules(securityTransferDocument, line);
064 }
065
066 if (isValid) {
067 isValid &= validateSecurityTransferTransactionLine(true, securityTransferDocument, line, -1, -1);
068 }
069
070 return GlobalVariables.getMessageMap().getErrorCount() == 0;
071 }
072
073 /**
074 * Validates that one and only one source transaction line can be added.
075 *
076 * @param validateForAdd tells whether the validation is for add or not
077 * @param endowmentTransactionLinesDocument
078 * @return true if valid, false otherwise
079 */
080 protected boolean validateOnlyOneSourceTransactionLine(boolean validateForAdd, EndowmentTransactionLinesDocument endowmentTransactionLinesDocument, EndowmentTransactionLine line, int index) {
081 boolean isValid = true;
082
083 if (line instanceof EndowmentSourceTransactionLine) {
084
085 // if we do validation upon adding a new transaction line make sure we don't allow more than one line to be added; if
086 // there
087 // is already one source transaction line than validation will fail as no more source transaction line can be added
088 if (validateForAdd) {
089 if (endowmentTransactionLinesDocument.getSourceTransactionLines() != null && endowmentTransactionLinesDocument.getSourceTransactionLines().size() >= 1) {
090 isValid = false;
091 putFieldError(getErrorPrefix(line, index), EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_SECURITY_TRANSFER_ONE_AND_ONLY_ONE_SOURCE_TRANS_LINE);
092 }
093 }
094 // if we do validation on save or submit we have to make sure that there is one and only one source transaction line
095 else {
096 if (endowmentTransactionLinesDocument.getSourceTransactionLines() != null && endowmentTransactionLinesDocument.getSourceTransactionLines().size() != 1) {
097 isValid = false;
098 putFieldError(getErrorPrefix(line, index), EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_SECURITY_TRANSFER_ONE_AND_ONLY_ONE_SOURCE_TRANS_LINE);
099 }
100 }
101 }
102
103 return isValid;
104
105 }
106
107 /**
108 * Validate Security Transfer Transaction Line.
109 *
110 * @param endowmentTransactionLinesDocumentBase
111 * @param line
112 * @param index
113 * @return
114 */
115 protected boolean validateSecurityTransferTransactionLine(boolean isAdd, EndowmentTransactionLinesDocument endowmentTransactionLinesDocument, EndowmentTransactionLine line, int transLineIndex, int taxLotIndex) {
116 boolean isValid = super.validateTransactionLine(endowmentTransactionLinesDocument, line, transLineIndex);
117
118 if (isValid) {
119 // Obtain Prefix for Error fields in UI.
120 String ERROR_PREFIX = getErrorPrefix(line, transLineIndex);
121
122 // Validate Units is Greater then Zero(thus positive) value
123 isValid &= validateTransactionUnitsGreaterThanZero(line, ERROR_PREFIX);
124 if (isValid) {
125
126 if (line instanceof EndowmentSourceTransactionLine) {
127 // Validate if Sufficient Units are Avaiable
128 isValid &= validateSufficientUnits(isAdd, endowmentTransactionLinesDocument, line, transLineIndex, taxLotIndex);
129 }
130
131 // Check if value of Endowment is being reduced.
132 checkWhetherReducePermanentlyRestrictedFund(line, ERROR_PREFIX);
133 }
134 }
135
136 return GlobalVariables.getMessageMap().getErrorCount() == 0;
137 }
138
139 /**
140 * @see org.kuali.rice.kns.rules.DocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.Document)
141 */
142 @Override
143 protected boolean processCustomRouteDocumentBusinessRules(Document document) {
144 boolean isValid = super.processCustomRouteDocumentBusinessRules(document);
145
146 if (isValid) {
147 SecurityTransferDocument securityTransferDocument = (SecurityTransferDocument) document;
148
149 // Validate Security
150 isValid &= validateSecurity(isValid, securityTransferDocument, true);
151
152 // Validate Registration code.
153 isValid &= validateRegistration(isValid, securityTransferDocument, true);
154
155 // Validate atleast one Source Tx was entered.
156 if (!transactionLineSizeGreaterThanZero(securityTransferDocument, true))
157 return false;
158
159 // Validate atleast one Target Tx was entered.
160 if (!transactionLineSizeGreaterThanZero(securityTransferDocument, false))
161 return false;
162
163 // Obtaining all the transaction lines for validations
164 List<EndowmentTransactionLine> txLines = new ArrayList<EndowmentTransactionLine>();
165 txLines.addAll(securityTransferDocument.getSourceTransactionLines());
166 txLines.addAll(securityTransferDocument.getTargetTransactionLines());
167
168 // Validate All the Transaction Lines.
169 for (int i = 0; i < txLines.size(); i++) {
170 EndowmentTransactionLine txLine = txLines.get(i);
171
172 if (!validateSecurityTransferTransactionLine(false, securityTransferDocument, txLine, i, -1)) {
173 return false;
174 }
175
176 isValid &= validateTaxLots(securityTransferDocument, txLine, i);
177 isValid &= validateTotalUnits(securityTransferDocument, txLine, i);
178 }
179
180 // Validate the source & target units are equal.
181 isValid &= validateSourceTargetUnitsEqual(securityTransferDocument);
182
183 // Validate the source & target amounts are equal.
184 isValid &= validateSourceTargetAmountEqual(securityTransferDocument);
185
186 }
187
188 return GlobalVariables.getMessageMap().getErrorCount() == 0;
189 }
190
191 /**
192 * @see org.kuali.kfs.module.endow.document.validation.impl.EndowmentTransactionalDocumentBaseRule#validateSecurityClassTypeCode(org.kuali.kfs.module.endow.document.EndowmentSecurityDetailsDocument,
193 * boolean, java.lang.String)
194 */
195 @Override
196 protected boolean validateSecurityClassTypeCode(EndowmentSecurityDetailsDocument document, boolean isSource, String classCodeType) {
197 return true;
198 }
199
200 /**
201 * @see org.kuali.kfs.module.endow.document.validation.impl.EndowmentTransactionLinesDocumentBaseRules#processRefreshTransactionLineRules(org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument,
202 * org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine, java.lang.Number)
203 */
204 @Override
205 public boolean processRefreshTransactionLineRules(EndowmentTransactionLinesDocument endowmentTransactionLinesDocument, EndowmentTransactionLine endowmentTransactionLine, Number index) {
206 boolean isValid = super.processRefreshTransactionLineRules(endowmentTransactionLinesDocument, endowmentTransactionLine, index);
207 if (isValid) {
208 isValid &= validateSecurityTransferTransactionLine(false, endowmentTransactionLinesDocument, endowmentTransactionLine, (Integer) index, -1);
209 }
210 return isValid;
211 }
212
213 /**
214 * @see org.kuali.kfs.module.endow.document.validation.DeleteTaxLotLineRule#processDeleteTaxLotLineRules(org.kuali.kfs.module.endow.document.EndowmentTaxLotLinesDocument,
215 * org.kuali.kfs.module.endow.businessobject.EndowmentTransactionTaxLotLine,
216 * org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine, java.lang.Number, java.lang.Number)
217 */
218 public boolean processDeleteTaxLotLineRules(EndowmentTaxLotLinesDocument endowmentTaxLotLinesDocument, EndowmentTransactionTaxLotLine endowmentTransactionTaxLotLine, EndowmentTransactionLine endowmentTransactionLine, Number index, Number numberX) {
219
220 boolean isValid = true;
221 isValid &= validateTransactionLine(endowmentTaxLotLinesDocument, endowmentTransactionLine, (Integer) index);
222 if (isValid) {
223 isValid &= validateSecurityTransferTransactionLine(false, endowmentTaxLotLinesDocument, endowmentTransactionLine, (Integer) index, (Integer) numberX);
224 }
225 return isValid;
226 }
227 }