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 org.apache.commons.lang.StringUtils;
019 import org.kuali.kfs.coa.businessobject.Account;
020 import org.kuali.kfs.coa.businessobject.Chart;
021 import org.kuali.kfs.coa.businessobject.ObjectCode;
022 import org.kuali.kfs.coa.businessobject.ObjectLevel;
023 import org.kuali.kfs.coa.businessobject.ProjectCode;
024 import org.kuali.kfs.coa.businessobject.SubAccount;
025 import org.kuali.kfs.coa.businessobject.SubObjectCode;
026 import org.kuali.kfs.coa.service.AccountService;
027 import org.kuali.kfs.coa.service.ChartService;
028 import org.kuali.kfs.coa.service.ObjectCodeService;
029 import org.kuali.kfs.coa.service.ObjectLevelService;
030 import org.kuali.kfs.module.endow.EndowConstants;
031 import org.kuali.kfs.module.endow.EndowKeyConstants;
032 import org.kuali.kfs.module.endow.EndowPropertyConstants;
033 import org.kuali.kfs.module.endow.businessobject.EndowmentAccountingLine;
034 import org.kuali.kfs.module.endow.businessobject.SourceEndowmentAccountingLine;
035 import org.kuali.kfs.module.endow.document.EndowmentAccountingLinesDocument;
036 import org.kuali.kfs.module.endow.document.EndowmentAccountingLinesDocumentBase;
037 import org.kuali.kfs.module.endow.document.validation.AddEndowmentAccountingLineRule;
038 import org.kuali.kfs.module.endow.document.validation.DeleteEndowmentAccountingLineRule;
039 import org.kuali.kfs.sys.KFSConstants;
040 import org.kuali.kfs.sys.KFSKeyConstants;
041 import org.kuali.kfs.sys.KFSPropertyConstants;
042 import org.kuali.kfs.sys.context.SpringContext;
043 import org.kuali.rice.kns.datadictionary.DataDictionary;
044 import org.kuali.rice.kns.document.Document;
045 import org.kuali.rice.kns.service.DataDictionaryService;
046 import org.kuali.rice.kns.util.GlobalVariables;
047 import org.kuali.rice.kns.util.KualiDecimal;
048 import org.kuali.rice.kns.util.ObjectUtils;
049
050 public class EndowmentAccountingLinesDocumentBaseRules extends EndowmentTransactionLinesDocumentBaseRules implements AddEndowmentAccountingLineRule<EndowmentAccountingLinesDocument, EndowmentAccountingLine>, DeleteEndowmentAccountingLineRule<EndowmentAccountingLinesDocument, EndowmentAccountingLine> {
051
052 /**
053 * @see org.kuali.kfs.module.endow.document.validation.AddEndowmentAccountingLineRule#processAddEndowmentAccountingLineRules(org.kuali.kfs.module.endow.document.EndowmentAccountingLinesDocument,
054 * org.kuali.kfs.module.endow.businessobject.EndowmentAccountingLine)
055 */
056 public boolean processAddEndowmentAccountingLineRules(EndowmentAccountingLinesDocument endowmentAccountingLinesDocument, EndowmentAccountingLine endowmentAccountingLine) {
057 boolean isValid = true;
058 isValid &= validateAccountingLine(endowmentAccountingLinesDocument, endowmentAccountingLine, -1);
059 return isValid;
060 }
061
062 /**
063 * @see org.kuali.kfs.module.endow.document.validation.DeleteEndowmentAccountingLineRule#processDeleteAccountingLineRules(org.kuali.kfs.module.endow.document.EndowmentAccountingLinesDocument,
064 * org.kuali.kfs.module.endow.businessobject.EndowmentAccountingLine)
065 */
066 public boolean processDeleteAccountingLineRules(EndowmentAccountingLinesDocument EndowmentAccountingLinesDocument, EndowmentAccountingLine EndowmentAccountingLine) {
067 // TODO Auto-generated method stub
068 return true;
069 }
070
071 /**
072 * Validates the given accounting Line.
073 *
074 * @param accountingLinesDocument
075 * @param accountingLine
076 * @param index
077 * @return true if valid, false otherwise
078 */
079 protected boolean validateAccountingLine(EndowmentAccountingLinesDocument accountingLinesDocument, EndowmentAccountingLine accountingLine, int index) {
080 boolean isValid = true;
081
082 // validate chart code
083 if (isChartCodeEmpty(accountingLine, index)) {
084 return false;
085 }
086
087 if (!validateChartCode(accountingLine, index)) {
088 return false;
089 }
090
091 isValid &= validateChartCodeIsActive(accountingLine, index);
092
093 // validate account
094 if (isAccountNumberEmpty(accountingLine, index)) {
095 return false;
096 }
097
098 if (!validateAccount(accountingLine, index)) {
099 return false;
100 }
101
102 isValid &= validateAccountIsActive(accountingLine, index);
103 isValid &= validateAccountNotExpired(accountingLine, index);
104
105 // validate object code
106 if (isObjectCodeEmpty(accountingLine, index)) {
107 return false;
108 }
109
110 if (!validateObjectCode(accountingLine, index)) {
111 return false;
112 }
113
114 isValid &= validateObjectCodeIsActive(accountingLine, index);
115 isValid &= validateObjectCodeObjectConsolidation(accountingLine, index);
116 isValid &= validateObjectCodeType(accountingLine, index);
117
118 isValid &= validateSubAccountNumber(accountingLine, index);
119 isValid &= validateSubObjectCode(accountingLine, index);
120 isValid &= validateProjectCode(accountingLine, index);
121
122 isValid &= validateTransactionAmount(accountingLine, index);
123
124 return isValid;
125 }
126
127
128 /**
129 * Validates the transaction amount for the given accounting line.
130 *
131 * @param accountingLine
132 * @param index
133 * @return true if valid, false otherwise
134 */
135 private boolean validateTransactionAmount(EndowmentAccountingLine accountingLine, int index) {
136 boolean isValid = true;
137
138 if (accountingLine.getAmount().isLessEqual(KualiDecimal.ZERO)) {
139 putFieldError(getAcctLineErrorPrefix(accountingLine, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_AMOUNT, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_AMT_INVALID);
140 isValid = false;
141 }
142
143 return isValid;
144
145 }
146
147
148 /**
149 * Gets the prefix for an accounting line error.
150 *
151 * @param line
152 * @param index
153 * @return the prefix
154 */
155 public String getAcctLineErrorPrefix(EndowmentAccountingLine line, int index) {
156 String ERROR_PREFIX = null;
157 if (line instanceof SourceEndowmentAccountingLine) {
158 if (index == -1) {
159 ERROR_PREFIX = EndowPropertyConstants.SOURCE_ACCT_LINE_PREFIX;
160 }
161 else {
162 ERROR_PREFIX = EndowPropertyConstants.EXISTING_SOURCE_ACCT_LINE_PREFIX + "[" + index + "].";
163 }
164 }
165 else {
166 if (index == -1) {
167 ERROR_PREFIX = EndowPropertyConstants.TARGET_ACCT_LINE_PREFIX;
168 }
169 else {
170 ERROR_PREFIX = EndowPropertyConstants.EXISTING_TARGET_ACCT_LINE_PREFIX + "[" + index + "].";
171 }
172 }
173 return ERROR_PREFIX;
174
175 }
176
177 /**
178 * Checks if the chart code is empty.
179 *
180 * @param line
181 * @param index
182 * @return true if valid, false otherwise
183 */
184 protected boolean isChartCodeEmpty(EndowmentAccountingLine line, int index) {
185 if (StringUtils.isBlank(line.getChartOfAccountsCode())) {
186 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_CHART_CD, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_CHART_CODE_REQUIRED);
187 return true;
188 }
189 else
190 return false;
191 }
192
193 /**
194 * Validates that the chart code exists in the database.
195 *
196 * @param line
197 * @param index
198 * @return true if valid, false otherwise
199 */
200 protected boolean validateChartCode(EndowmentAccountingLine line, int index) {
201 boolean isValid = true;
202
203 String chartOfAccountsCode = line.getChartOfAccountsCode();
204
205 Chart chartCode = SpringContext.getBean(ChartService.class).getByPrimaryId(chartOfAccountsCode);
206
207 if (ObjectUtils.isNull(chartCode)) {
208 isValid = false;
209 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_CHART_CD, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_CHART_CODE_INVALID);
210 }
211
212 return isValid;
213 }
214
215 /**
216 * Validates if the chart code is Active.
217 *
218 * @param line
219 * @param index
220 * @return true of active, false otherwise
221 */
222 protected boolean validateChartCodeIsActive(EndowmentAccountingLine line, int index) {
223 boolean isValid = true;
224
225 String chartOfAccountsCode = line.getChartOfAccountsCode();
226
227 Chart chartCode = SpringContext.getBean(ChartService.class).getByPrimaryId(chartOfAccountsCode);
228
229 if (ObjectUtils.isNotNull(chartCode)) {
230 if (!chartCode.isActive()) {
231 isValid = false;
232 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_CHART_CD, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_CHART_CODE_INACTIVE);
233 }
234 }
235
236 return isValid;
237 }
238
239 /**
240 * Checks if the account number is empty.
241 *
242 * @param line
243 * @param index
244 * @return true if empty, false otherwise
245 */
246 protected boolean isAccountNumberEmpty(EndowmentAccountingLine line, int index) {
247 if (StringUtils.isBlank(line.getAccountNumber())) {
248 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_ACCT_NBR, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_CHART_CODE_REQUIRED);
249 return true;
250 }
251 else
252 return false;
253 }
254
255 /**
256 * Validates if the account exists in the database.
257 *
258 * @param line
259 * @param index
260 * @return true if it exists, false otherwise
261 */
262 protected boolean validateAccount(EndowmentAccountingLine line, int index) {
263 boolean isValid = true;
264
265 String accountNumber = line.getAccountNumber();
266 String chartOfAccountsCode = line.getChartOfAccountsCode();
267
268 Account account = SpringContext.getBean(AccountService.class).getByPrimaryId(chartOfAccountsCode, accountNumber);
269
270 if (ObjectUtils.isNull(account)) {
271 isValid = false;
272 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_ACCT_NBR, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_ACCT_NBR_INVALID);
273 }
274
275 return isValid;
276 }
277
278 /**
279 * Validates that the account is active.
280 *
281 * @param line
282 * @param index
283 * @return true if active, false otherwise
284 */
285 protected boolean validateAccountIsActive(EndowmentAccountingLine line, int index) {
286 boolean isValid = true;
287
288 String accountNumber = line.getAccountNumber();
289 String chartOfAccountsCode = line.getChartOfAccountsCode();
290
291 Account account = SpringContext.getBean(AccountService.class).getByPrimaryId(chartOfAccountsCode, accountNumber);
292
293 if (ObjectUtils.isNotNull(account)) {
294 if (!account.isActive()) {
295 isValid = false;
296 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_ACCT_NBR, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_ACCT_NBR_INACTIVE);
297 }
298 }
299
300 return isValid;
301 }
302
303 /**
304 * Validates if the account is expired.
305 *
306 * @param line
307 * @param index
308 * @return true if not expired, false otherwise.
309 */
310 protected boolean validateAccountNotExpired(EndowmentAccountingLine line, int index) {
311 boolean isValid = true;
312
313 String accountNumber = line.getAccountNumber();
314 String chartOfAccountsCode = line.getChartOfAccountsCode();
315
316 Account account = SpringContext.getBean(AccountService.class).getByPrimaryId(chartOfAccountsCode, accountNumber);
317
318 if (ObjectUtils.isNotNull(account)) {
319 if (account.isExpired()) {
320 isValid = false;
321 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_ACCT_NBR, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_ACCT_NBR_EXPIRED);
322 }
323 }
324
325 return isValid;
326 }
327
328 /**
329 * Checks if the object code is empty.
330 *
331 * @param line
332 * @param index
333 * @return true if empty, false otherwise
334 */
335 protected boolean isObjectCodeEmpty(EndowmentAccountingLine line, int index) {
336
337 if (StringUtils.isBlank(line.getFinancialObjectCode())) {
338 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_OBJECT_CD, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_OBJECT_CODE_REQUIRED);
339 return true;
340 }
341 else
342 return false;
343 }
344
345 /**
346 * Validates that the object code exists.
347 *
348 * @param line
349 * @param index
350 * @return true if valid, false otherwise
351 */
352 protected boolean validateObjectCode(EndowmentAccountingLine line, int index) {
353 boolean isValid = true;
354
355 String financialObjectCode = line.getFinancialObjectCode();
356 String chartOfAccountsCode = line.getChartOfAccountsCode();
357
358 ObjectCode objectCode = SpringContext.getBean(ObjectCodeService.class).getByPrimaryIdForCurrentYear(chartOfAccountsCode, financialObjectCode);
359
360 if (ObjectUtils.isNull(objectCode)) {
361 isValid = false;
362 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_OBJECT_CD, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_OBJECT_CODE_INVALID);
363 }
364
365 return isValid;
366 }
367
368 /**
369 * Validates that the object code is active.
370 *
371 * @param line
372 * @param index
373 * @return true if active, false otherwise
374 */
375 protected boolean validateObjectCodeIsActive(EndowmentAccountingLine line, int index) {
376 boolean isValid = true;
377
378 String financialObjectCode = line.getFinancialObjectCode();
379 String chartOfAccountsCode = line.getChartOfAccountsCode();
380
381 ObjectCode objectCode = SpringContext.getBean(ObjectCodeService.class).getByPrimaryIdForCurrentYear(chartOfAccountsCode, financialObjectCode);
382
383 if (ObjectUtils.isNotNull(objectCode)) {
384 if (!objectCode.isActive()) {
385 isValid = false;
386 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_OBJECT_CD, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_OBJECT_CODE_INACTIVE);
387 }
388 }
389
390 return isValid;
391 }
392
393 /**
394 * Validate that the object code does not represent assets, liabilities or funds balances (as indicated by the object code's
395 * object consolidation).
396 *
397 * @param line
398 * @param index
399 * @return true if valid, false otherwise
400 */
401 protected boolean validateObjectCodeObjectConsolidation(EndowmentAccountingLine line, int index) {
402 boolean isValid = true;
403
404 String financialObjectCode = line.getFinancialObjectCode();
405 String chartOfAccountsCode = line.getChartOfAccountsCode();
406
407 ObjectCode objectCode = SpringContext.getBean(ObjectCodeService.class).getByPrimaryIdForCurrentYear(chartOfAccountsCode, financialObjectCode);
408 ObjectLevel objectLevel = SpringContext.getBean(ObjectLevelService.class).getByPrimaryId(chartOfAccountsCode, objectCode.getFinancialObjectLevelCode());
409
410 if (ObjectUtils.isNotNull(objectLevel)) {
411 String consolidatedObjectCode = objectCode.getFinancialObjectLevel().getFinancialConsolidationObjectCode();
412
413 if (EndowConstants.ConsolidatedObjectCode.ASSETS.equalsIgnoreCase(consolidatedObjectCode) || EndowConstants.ConsolidatedObjectCode.LIABILITIES.equalsIgnoreCase(consolidatedObjectCode) || EndowConstants.ConsolidatedObjectCode.FUND_BALANCE.equalsIgnoreCase(consolidatedObjectCode)) {
414 isValid &= false;
415 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_OBJECT_CD, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_OBJECT_CODE_NOT_ASSET_LIABILITY_OR_FUND_BAL);
416 }
417 }
418
419 return isValid;
420 }
421
422 /**
423 * Validates that Object codes belonging to the object types of Expense not Expenditure and Income not Cash may not be used on a
424 * Transfer of Funds document.
425 *
426 * @param line
427 * @param index
428 * @return true if valid, false otherwise
429 */
430 protected boolean validateObjectCodeType(EndowmentAccountingLine line, int index) {
431 boolean isValid = true;
432
433 String financialObjectCode = line.getFinancialObjectCode();
434 String chartOfAccountsCode = line.getChartOfAccountsCode();
435
436 ObjectCode objectCode = SpringContext.getBean(ObjectCodeService.class).getByPrimaryIdForCurrentYear(chartOfAccountsCode, financialObjectCode);
437 String objectType = objectCode.getFinancialObjectTypeCode();
438
439 if (StringUtils.isNotBlank(objectType)) {
440
441 if (EndowConstants.ObjectTypeCode.EXPENSE_NOT_EXPENDITURE.equalsIgnoreCase(objectType) || EndowConstants.ObjectTypeCode.INCOME_NOT_CASH.equalsIgnoreCase(objectType)) {
442 isValid &= false;
443 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_OBJECT_CD, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_OBJECT_TYPE_NOT_VALID);
444 }
445 }
446
447 return isValid;
448 }
449
450 /**
451 * Validates that if the sub account number is not empty it exists in the DB and is active.
452 *
453 * @param line
454 * @param index
455 * @return true if valid, false otherwise
456 */
457 protected boolean validateSubAccountNumber(EndowmentAccountingLine line, int index) {
458 boolean isValid = true;
459
460 DataDictionary dd = SpringContext.getBean(DataDictionaryService.class).getDataDictionary();
461 String label = dd.getBusinessObjectEntry(SubAccount.class.getName()).getAttributeDefinition(KFSConstants.SUB_ACCOUNT_NUMBER_PROPERTY_NAME).getShortLabel();
462
463 // sub object is not required
464 if (StringUtils.isNotBlank(line.getSubAccountNumber())) {
465 line.refreshReferenceObject("subAccount");
466 SubAccount subAccount = line.getSubAccount();
467
468 // make sure it exists
469 if (ObjectUtils.isNull(subAccount)) {
470 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_SUBACCT_NBR, KFSKeyConstants.ERROR_EXISTENCE, label);
471 return false;
472 }
473
474 // check active flag
475 if (!subAccount.isActive()) {
476 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_SUBACCT_NBR, KFSKeyConstants.ERROR_INACTIVE, label);
477 return false;
478 }
479 }
480
481 return isValid;
482 }
483
484 /**
485 * Validates that if the sub object code is not empty it exists in the DB and is active.
486 *
487 * @param line
488 * @param index
489 * @return true if valid, false otherwise
490 */
491 protected boolean validateSubObjectCode(EndowmentAccountingLine line, int index) {
492 boolean isValid = true;
493
494 DataDictionary dd = SpringContext.getBean(DataDictionaryService.class).getDataDictionary();
495 String label = dd.getBusinessObjectEntry(SubObjectCode.class.getName()).getAttributeDefinition(KFSConstants.FINANCIAL_SUB_OBJECT_CODE_PROPERTY_NAME).getShortLabel();
496
497 // sub object is not required
498 if (StringUtils.isNotBlank(line.getFinancialSubObjectCode())) {
499 line.refreshReferenceObject("subObjectCode");
500 SubObjectCode subObjectCode = line.getSubObjectCode();
501
502 // make sure it exists
503 if (ObjectUtils.isNull(subObjectCode)) {
504 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_SUBOBJ_CD, KFSKeyConstants.ERROR_EXISTENCE, label);
505 return false;
506 }
507
508 // check active flag
509 if (!subObjectCode.isActive()) {
510 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_SUBOBJ_CD, KFSKeyConstants.ERROR_INACTIVE, label);
511 return false;
512 }
513 }
514
515 return isValid;
516 }
517
518 /**
519 * Validates that if the project code is not empty it exists in the DB and is active.
520 *
521 * @param line
522 * @param index
523 * @return true if valid, false otherwise
524 */
525 protected boolean validateProjectCode(EndowmentAccountingLine line, int index) {
526 boolean isValid = true;
527
528 DataDictionary dd = SpringContext.getBean(DataDictionaryService.class).getDataDictionary();
529 String label = dd.getBusinessObjectEntry(ProjectCode.class.getName()).getAttributeDefinition(KFSPropertyConstants.CODE).getShortLabel();
530
531 // sub object is not required
532 if (StringUtils.isNotBlank(line.getProjectCode())) {
533 line.refreshReferenceObject("project");
534 ProjectCode project = line.getProject();
535
536 // make sure it exists
537 if (ObjectUtils.isNull(project)) {
538 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_PROJECT_CD, KFSKeyConstants.ERROR_EXISTENCE, label);
539 return false;
540 }
541
542 // check active flag
543 if (!project.isActive()) {
544 putFieldError(getAcctLineErrorPrefix(line, index) + EndowPropertyConstants.ENDOWMENT_ACCOUNTING_LINE_PROJECT_CD, KFSKeyConstants.ERROR_INACTIVE, label);
545 return false;
546 }
547 }
548
549 return isValid;
550 }
551
552 /**
553 * Validates that the document has at least one accounting line.
554 *
555 * @param document
556 * @param isSource
557 * @return true if valid, false otherwise
558 */
559 protected boolean validateAccountingLinesSizeGreaterThanZero(EndowmentAccountingLinesDocument document, boolean isSource) {
560 boolean isValid = true;
561 if (isSource) {
562 isValid &= (document.getSourceAccountingLines().size() > 0);
563 }
564 else {
565 isValid &= (document.getTargetAccountingLines().size() > 0);
566 }
567
568 if (!isValid) {
569 putFieldError(EndowConstants.ACCOUNTING_LINE_ERRORS, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_ACCT_LINE_COUNT_INSUFFICIENT);
570 }
571 return isValid;
572 }
573
574 /**
575 * @see org.kuali.kfs.module.endow.document.validation.impl.EndowmentTransactionLinesDocumentBaseRules#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.Document)
576 */
577 @Override
578 protected boolean processCustomRouteDocumentBusinessRules(Document document) {
579 boolean isValid = super.processCustomRouteDocumentBusinessRules(document);
580
581 EndowmentAccountingLinesDocumentBase endowmentAccountingLinesDocumentBase = null;
582
583 if (isValid) {
584 endowmentAccountingLinesDocumentBase = (EndowmentAccountingLinesDocumentBase) document;
585
586 // check that the document is not out of balance
587 isValid &= validateGLTotalAmountMatchesKEMTotalAmount(endowmentAccountingLinesDocumentBase);
588
589 // validate source Accounting lines
590 if (endowmentAccountingLinesDocumentBase.getSourceAccountingLines() != null) {
591 for (int i = 0; i < endowmentAccountingLinesDocumentBase.getSourceAccountingLines().size(); i++) {
592 EndowmentAccountingLine accountingLine = endowmentAccountingLinesDocumentBase.getSourceAccountingLines().get(i);
593 isValid &= validateAccountingLine(endowmentAccountingLinesDocumentBase, accountingLine, i);
594 }
595 }
596
597 // validate target Accounting lines
598 if (endowmentAccountingLinesDocumentBase.getTargetAccountingLines() != null) {
599 for (int i = 0; i < endowmentAccountingLinesDocumentBase.getTargetAccountingLines().size(); i++) {
600 EndowmentAccountingLine accountingLine = endowmentAccountingLinesDocumentBase.getTargetAccountingLines().get(i);
601 isValid &= validateAccountingLine(endowmentAccountingLinesDocumentBase, accountingLine, i);
602 }
603 }
604
605 }
606
607 return isValid;
608 }
609
610
611 /**
612 * Validates that the total amount in the FROM section equals the total amount in the To section.
613 *
614 * @param endowmentAccountingLinesDocumentBase
615 * @return true if valid, false otherwise
616 */
617 protected boolean validateGLTotalAmountMatchesKEMTotalAmount(EndowmentAccountingLinesDocumentBase endowmentAccountingLinesDocumentBase) {
618 boolean isValid = true;
619
620 KualiDecimal glTotalAmount = endowmentAccountingLinesDocumentBase.getTotalAccountingLinesAmount();
621 KualiDecimal kemTotalAmount = endowmentAccountingLinesDocumentBase.getTotalDollarAmount();
622
623 if (!glTotalAmount.equals(kemTotalAmount)) {
624 isValid = false;
625 GlobalVariables.getMessageMap().putError(EndowConstants.TRANSACTION_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_BALANCE);
626 }
627
628 return isValid;
629 }
630 }