1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.kuali.kfs.coa.document.validation.impl;
20  
21  import java.util.ArrayList;
22  import java.util.Collection;
23  import java.util.HashMap;
24  import java.util.List;
25  import java.util.Map;
26  import java.util.Properties;
27  import java.util.Set;
28  
29  import org.apache.commons.lang.StringUtils;
30  import org.kuali.kfs.coa.businessobject.IndirectCostRecoveryExclusionAccount;
31  import org.kuali.kfs.coa.businessobject.ObjectCode;
32  import org.kuali.kfs.coa.businessobject.ObjectCodeGlobal;
33  import org.kuali.kfs.coa.businessobject.ObjectCodeGlobalDetail;
34  import org.kuali.kfs.coa.businessobject.ObjectLevel;
35  import org.kuali.kfs.coa.businessobject.OffsetDefinition;
36  import org.kuali.kfs.coa.service.ObjectCodeService;
37  import org.kuali.kfs.coa.service.ObjectLevelService;
38  import org.kuali.kfs.sys.KFSConstants;
39  import org.kuali.kfs.sys.KFSKeyConstants;
40  import org.kuali.kfs.sys.KFSPropertyConstants;
41  import org.kuali.kfs.sys.context.SpringContext;
42  import org.kuali.kfs.sys.service.UniversityDateService;
43  import org.kuali.rice.kns.document.MaintenanceDocument;
44  import org.kuali.rice.kns.maintenance.Maintainable;
45  import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
46  import org.kuali.rice.krad.bo.BusinessObject;
47  import org.kuali.rice.krad.bo.GlobalBusinessObject;
48  import org.kuali.rice.krad.bo.PersistableBusinessObject;
49  import org.kuali.rice.krad.datadictionary.InactivationBlockingMetadata;
50  import org.kuali.rice.krad.service.BusinessObjectService;
51  import org.kuali.rice.krad.service.InactivationBlockingDetectionService;
52  import org.kuali.rice.krad.util.GlobalVariables;
53  import org.kuali.rice.krad.util.KRADConstants;
54  import org.kuali.rice.krad.util.ObjectUtils;
55  import org.kuali.rice.krad.util.UrlFactory;
56  
57  
58  
59  
60  public class ObjectCodeGlobalRule extends MaintenanceDocumentRuleBase {
61      protected ObjectCodeGlobal objectCodeGlobal;
62      protected ObjectCodeService objectCodeService;
63      protected ObjectLevelService objectLevelService;
64  
65      public ObjectCodeGlobalRule() {
66          super();
67          setObjectCodeService(SpringContext.getBean(ObjectCodeService.class));
68          setObjectLevelService(SpringContext.getBean(ObjectLevelService.class));
69      }
70  
71  
72      
73  
74  
75  
76  
77  
78  
79      @Override
80      public void setupConvenienceObjects() {
81  
82          
83          
84          objectCodeGlobal = (ObjectCodeGlobal) super.getNewBo();
85  
86          
87          for (ObjectCodeGlobalDetail objectCodeGlobalDetail : objectCodeGlobal.getObjectCodeGlobalDetails()) {
88              objectCodeGlobalDetail.refreshNonUpdateableReferences();
89          }
90      }
91  
92      
93  
94  
95  
96  
97  
98  
99  
100     @Override
101     protected boolean processCustomApproveDocumentBusinessRules(MaintenanceDocument document) {
102         boolean success = true;
103         setupConvenienceObjects();
104         
105         success &= checkSimpleRulesAllLines();
106         return success;
107     }
108 
109     
110 
111 
112 
113 
114 
115 
116 
117     @Override
118     protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
119         boolean success = true;
120         setupConvenienceObjects();
121         
122         success &= checkSimpleRulesAllLines();
123         return success;
124     }
125 
126 
127     @Override
128     protected boolean processInactivationBlockChecking(MaintenanceDocument maintenanceDocument) {
129         boolean success = true;
130         if (!objectCodeGlobal.isFinancialObjectActiveIndicator()) {
131             
132             Collection<? extends ObjectCodeGlobalDetail> objectCodeGlobalDetails = objectCodeGlobal.getObjectCodeGlobalDetails();
133             int i = 0;
134             for ( ObjectCodeGlobalDetail objectCodeGlobalDetail : objectCodeGlobalDetails ) {
135                 
136                 ObjectCode objectCode = objectCodeService.getByPrimaryId(objectCodeGlobalDetail.getUniversityFiscalYear(), objectCodeGlobalDetail.getChartOfAccountsCode(), objectCodeGlobal.getFinancialObjectCode());
137                 if (objectCode != null) {
138                     if (objectCode.isActive()) {
139                         
140                         success &= processInactivationBlockChecking(maintenanceDocument.getNewMaintainableObject(), objectCode, i);
141                     }
142                 }
143                 i++;
144             }
145         }
146         return success;
147     }
148 
149     protected boolean processInactivationBlockChecking(Maintainable maintainable, ObjectCode objectCode, int index) {
150         Set<InactivationBlockingMetadata> inactivationBlockingMetadatas = ddService.getAllInactivationBlockingDefinitions(ObjectCode.class);
151         for (InactivationBlockingMetadata inactivationBlockingMetadata : inactivationBlockingMetadatas) {
152             String inactivationBlockingDetectionServiceBeanName = inactivationBlockingMetadata.getInactivationBlockingDetectionServiceBeanName();
153             InactivationBlockingDetectionService inactivationBlockingDetectionService;
154             if (StringUtils.isBlank(inactivationBlockingDetectionServiceBeanName)) {
155                 inactivationBlockingDetectionService = SpringContext.getBean(InactivationBlockingDetectionService.class);
156             } else {
157                 inactivationBlockingDetectionService = SpringContext.getBean(InactivationBlockingDetectionService.class, inactivationBlockingDetectionServiceBeanName);
158             }
159 
160             Collection<BusinessObject> blockingBusinessObjects = inactivationBlockingDetectionService.listAllBlockerRecords(objectCode, inactivationBlockingMetadata);
161             blockingBusinessObjects = addAdditionalBlockingBusinessObjects(blockingBusinessObjects, objectCode);
162 
163             if (blockingBusinessObjects != null && !blockingBusinessObjects.isEmpty()) {
164                 final List<PersistableBusinessObject> persistingChanges = ((GlobalBusinessObject)maintainable.getBusinessObject()).generateGlobalChangesToPersist();
165                 if (!isOnlyPersistingChangesInBlockingBusinessObjects(blockingBusinessObjects, persistingChanges)) {
166                     putInactivationBlockingErrorOnPage(objectCode, inactivationBlockingMetadata, index);
167                     return false;
168                 }
169             }
170         }
171         return true;
172     }
173 
174     protected void putInactivationBlockingErrorOnPage(ObjectCode objectCode, InactivationBlockingMetadata inactivationBlockingMetadata, int index) {
175         String objectCodeSummaryString = objectCode.getUniversityFiscalYear() + " - " + objectCode.getChartOfAccountsCode() + " - " + objectCode.getFinancialObjectCode();
176 
177         Properties parameters = new Properties();
178         parameters.put(KRADConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, inactivationBlockingMetadata.getBlockedBusinessObjectClass().getName());
179         parameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.METHOD_DISPLAY_ALL_INACTIVATION_BLOCKERS);
180         parameters.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, objectCode.getUniversityFiscalYear().toString());
181         parameters.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, objectCode.getChartOfAccountsCode());
182         parameters.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, objectCode.getFinancialObjectCode());
183         String blockingUrl = UrlFactory.parameterizeUrl(KRADConstants.DISPLAY_ALL_INACTIVATION_BLOCKERS_ACTION, parameters);
184 
185         String errorPropertyPath = KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "[" + index + "]." + KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE;
186 
187         
188         GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(errorPropertyPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_INACTIVATION_BLOCKING, objectCodeSummaryString, blockingUrl);
189     }
190 
191     
192 
193 
194 
195 
196 
197     protected boolean isOnlyPersistingChangesInBlockingBusinessObjects(Collection<BusinessObject> blockingBusinessObjects, List<PersistableBusinessObject> persistingChanges) {
198         for (BusinessObject bo : blockingBusinessObjects) {
199             if (bo instanceof ObjectCode) {
200                 if (!isObjectCodeInPersistingChanges(persistingChanges, (ObjectCode)bo)) {
201                     return false;
202                 }
203             } else {
204                 return false;
205             }
206         }
207         return true;
208     }
209 
210     
211 
212 
213 
214 
215 
216     protected boolean isObjectCodeInPersistingChanges(List<PersistableBusinessObject> persistingChanges, ObjectCode objectCode) {
217         for (PersistableBusinessObject persistingObjectCodeAsObject : persistingChanges) {
218             if (isEqualObjectCode(objectCode, (ObjectCode)persistingObjectCodeAsObject)) {
219                 return true;
220             }
221         }
222         return false;
223     }
224 
225     
226 
227 
228 
229 
230 
231     protected boolean isEqualObjectCode(ObjectCode castor, ObjectCode pollux) {
232         return org.springframework.util.ObjectUtils.nullSafeEquals(castor.getUniversityFiscalYear(), pollux.getUniversityFiscalYear())
233                 && org.springframework.util.ObjectUtils.nullSafeEquals(castor.getChartOfAccountsCode(), pollux.getChartOfAccountsCode())
234                 && org.springframework.util.ObjectUtils.nullSafeEquals(castor.getFinancialObjectCode(), pollux.getFinancialObjectCode());
235     }
236 
237     
238 
239 
240 
241 
242 
243     protected Collection<BusinessObject> addAdditionalBlockingBusinessObjects(Collection<BusinessObject> blockingBusinessObjects, ObjectCode objectCode) {
244         List<BusinessObject> additionalBlockingObjects = new ArrayList<BusinessObject>();
245         retrieveBlockingOffsetDefinitions(objectCode, additionalBlockingObjects);
246         retrieveBlockingIndirectCostRecoveryExclusionAccounts(objectCode, additionalBlockingObjects);
247         if (!additionalBlockingObjects.isEmpty()) {
248             additionalBlockingObjects.addAll(blockingBusinessObjects);
249             return additionalBlockingObjects;
250         }
251         return blockingBusinessObjects;
252     }
253 
254     
255 
256 
257 
258 
259     protected void retrieveBlockingOffsetDefinitions(ObjectCode objectCode, List<BusinessObject> additionalBlockingObjects) {
260         final BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
261 
262         Map<String, Object> keys = new HashMap<String, Object>();
263         keys.put("universityFiscalYear", objectCode.getUniversityFiscalYear());
264         keys.put("chartOfAccountsCode", objectCode.getChartOfAccountsCode());
265         keys.put("financialObjectCode", objectCode.getFinancialObjectCode());
266 
267         Collection<OffsetDefinition> offsetDefinitions = businessObjectService.findMatching(OffsetDefinition.class, keys);
268         if (offsetDefinitions != null && !offsetDefinitions.isEmpty()) {
269             additionalBlockingObjects.addAll(offsetDefinitions);
270         }
271     }
272 
273     
274 
275 
276 
277 
278     protected void retrieveBlockingIndirectCostRecoveryExclusionAccounts(ObjectCode objectCode, List<BusinessObject> additionalBlockingObjects) {
279         final UniversityDateService universityDateService = SpringContext.getBean(UniversityDateService.class);
280         if (objectCode.getUniversityFiscalYear() != null && objectCode.getUniversityFiscalYear().equals(universityDateService.getCurrentFiscalYear())) {
281             final BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
282 
283             Map<String, Object> keys = new HashMap<String, Object>();
284             keys.put("financialObjectChartOfAccountCode", objectCode.getChartOfAccountsCode());
285             keys.put("financialObjectCode", objectCode.getFinancialObjectCode());
286 
287             Collection<IndirectCostRecoveryExclusionAccount> icrExclusionAccounts = businessObjectService.findMatching(IndirectCostRecoveryExclusionAccount.class, keys);
288             if (icrExclusionAccounts != null && !icrExclusionAccounts.isEmpty()) {
289                 additionalBlockingObjects.addAll(icrExclusionAccounts);
290             }
291         }
292     }
293 
294     
295 
296 
297 
298 
299 
300 
301 
302     @Override
303     protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
304         setupConvenienceObjects();
305         
306         checkSimpleRulesAllLines();
307 
308         return true;
309     }
310 
311     
312 
313 
314 
315 
316 
317 
318 
319 
320     @Override
321     public boolean processCustomAddCollectionLineBusinessRules(MaintenanceDocument document, String collectionName, PersistableBusinessObject bo) {
322         boolean success = true;
323         if (bo instanceof ObjectCodeGlobalDetail) {
324             ObjectCodeGlobalDetail detail = (ObjectCodeGlobalDetail) bo;
325             if (!checkEmptyValue(detail.getChartOfAccountsCode())) {
326                 
327                 GlobalVariables.getMessageMap().putError("chartOfAccountsCode", KFSKeyConstants.ERROR_REQUIRED, "Chart of Accounts Code");
328                 success &= false;
329             }
330             if (!checkEmptyValue(detail.getUniversityFiscalYear())) {
331                 
332                 GlobalVariables.getMessageMap().putError("universityFiscalYear", KFSKeyConstants.ERROR_REQUIRED, "University Fiscal Year");
333                 success &= false;
334             }
335             if (!checkUniqueIdentifiers(detail)) {
336                 
337                 success &= false;
338             }
339             
340             if (success) {
341                 success &= checkObjectCodeDetails(detail);
342             }
343 
344         }
345         return success;
346     }
347 
348     
349 
350 
351 
352 
353 
354     protected boolean checkUniqueIdentifiers(ObjectCodeGlobalDetail dtl) {
355         boolean success = true;
356         return success;
357 
358     }
359 
360     
361 
362 
363 
364 
365 
366 
367 
368 
369 
370 
371     public boolean checkObjectCodeDetails(ObjectCodeGlobalDetail dtl) {
372         boolean success = true;
373         int originalErrorCount = GlobalVariables.getMessageMap().getErrorCount();
374         getDictionaryValidationService().validateBusinessObject(dtl);
375         dtl.refreshNonUpdateableReferences();
376         
377         success &= checkObjectLevelCode(objectCodeGlobal, dtl, 0, true);
378         success &= checkNextYearObjectCode(objectCodeGlobal, dtl, 0, true);
379         success &= checkReportsToObjectCode(objectCodeGlobal, dtl, 0, true);
380         success &= GlobalVariables.getMessageMap().getErrorCount() == originalErrorCount;
381 
382         return success;
383     }
384 
385     
386 
387 
388 
389 
390 
391 
392     protected boolean checkReportsToObjectCode(ObjectCodeGlobal objectCodeGlobal, ObjectCodeGlobalDetail dtl, int lineNum, boolean add) {
393         boolean success = true;
394         String errorPath = KFSConstants.EMPTY_STRING;
395         if (checkEmptyValue(objectCodeGlobal.getReportsToFinancialObjectCode())) {
396             
397             String reportsToObjectCode = objectCodeGlobal.getReportsToFinancialObjectCode();
398             String reportsToChartCode = dtl.getChartOfAccounts().getReportsToChartOfAccountsCode();
399             Integer fiscalYear = dtl.getUniversityFiscalYear();
400 
401             
402             ObjectCode objCode = objectCodeService.getByPrimaryId(fiscalYear, reportsToChartCode, reportsToObjectCode);
403             if (ObjectUtils.isNull(objCode)) {
404                 success &= false;
405                 String[] errorParameters = { reportsToObjectCode, reportsToChartCode, fiscalYear.toString() };
406                 if (add) {
407                     errorPath = KFSConstants.MAINTENANCE_ADD_PREFIX + KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "." + "chartOfAccountsCode";
408                     putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_INVALID_RPTS_TO_OBJ_CODE, errorParameters);
409                 }
410                 else {
411                     errorPath = KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "[" + lineNum + "]." + "chartOfAccountsCode";
412                     putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_INVALID_RPTS_TO_OBJ_CODE, errorParameters);
413                 }
414             }
415             return success;
416 
417         }
418         else {
419             GlobalVariables.getMessageMap().putError("reportsToFinancialObjectCode", KFSKeyConstants.ERROR_REQUIRED, "Reports to Object Code");
420             success &= false;
421         }
422 
423         return success;
424     }
425 
426 
427     
428 
429 
430 
431 
432 
433 
434     protected boolean checkNextYearObjectCode(ObjectCodeGlobal objectCodeGlobal, ObjectCodeGlobalDetail dtl, int lineNum, boolean add) {
435         boolean success = true;
436         String errorPath = KFSConstants.EMPTY_STRING;
437         
438         if (checkEmptyValue(objectCodeGlobal.getNextYearFinancialObjectCode())) {
439             
440             ObjectCode objCode = objectCodeService.getByPrimaryId(dtl.getUniversityFiscalYear(), dtl.getChartOfAccountsCode(), objectCodeGlobal.getNextYearFinancialObjectCode());
441             if (ObjectUtils.isNull(objCode)) {
442                 success &= false;
443                 String[] errorParameters = { objectCodeGlobal.getNextYearFinancialObjectCode(), dtl.getChartOfAccountsCode(), dtl.getUniversityFiscalYear().toString() };
444                 if (add) {
445                     errorPath = KFSConstants.MAINTENANCE_ADD_PREFIX + KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "." + "chartOfAccountsCode";
446                     putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_INVALID_NEXT_YEAR_OBJ_CODE, errorParameters);
447                 }
448                 else {
449                     errorPath = KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "[" + lineNum + "]." + "chartOfAccountsCode";
450                     putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_INVALID_NEXT_YEAR_OBJ_CODE, errorParameters);
451                 }
452             }
453             return success;
454         }
455 
456         return success;
457     }
458 
459     
460 
461 
462 
463 
464 
465 
466     protected boolean checkObjectLevelCode(ObjectCodeGlobal objectCodeGlobal, ObjectCodeGlobalDetail dtl, int lineNum, boolean add) {
467         boolean success = true;
468         String errorPath = KFSConstants.EMPTY_STRING;
469         
470         if (checkEmptyValue(objectCodeGlobal.getFinancialObjectLevelCode())) {
471             ObjectLevel objLevel = objectLevelService.getByPrimaryId(dtl.getChartOfAccountsCode(), objectCodeGlobal.getFinancialObjectLevelCode());
472             if (ObjectUtils.isNull(objLevel)) {
473                 success &= false;
474                 String[] errorParameters = { objectCodeGlobal.getFinancialObjectLevelCode(), dtl.getChartOfAccountsCode() };
475                 if (add) {
476                     errorPath = KFSConstants.MAINTENANCE_ADD_PREFIX + KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "." + "chartOfAccountsCode";
477                     putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_INVALID_OBJ_LEVEL, errorParameters);
478                 }
479                 else {
480                     errorPath = KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "[" + lineNum + "]." + "chartOfAccountsCode";
481                     putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_INVALID_OBJ_LEVEL, errorParameters);
482                 }
483             }
484             return success;
485 
486         }
487         else {
488             GlobalVariables.getMessageMap().putError("financialObjectLevelCode", KFSKeyConstants.ERROR_REQUIRED, "Object Level Code");
489             success &= false;
490         }
491         return success;
492     }
493 
494     
495 
496 
497 
498 
499 
500 
501 
502 
503 
504 
505 
506     protected boolean checkSimpleRulesAllLines() {
507         boolean success = true;
508         
509         if (!checkForObjectCodeGlobalDetails(objectCodeGlobal.getObjectCodeGlobalDetails())) {
510             success = false;
511         }
512         else {
513             
514             success &= checkFiscalYearAllLines(objectCodeGlobal);
515 
516             
517             success &= checkChartAllLines(objectCodeGlobal);
518 
519             
520             success &= checkObjectLevelCodeAllLines(objectCodeGlobal);
521 
522             
523             success &= checkNextYearObjectCodeAllLines(objectCodeGlobal);
524 
525             
526             success &= checkReportsToObjectCodeAllLines(objectCodeGlobal);
527 
528         }
529         return success;
530     }
531 
532     
533 
534 
535 
536 
537 
538     protected boolean checkForObjectCodeGlobalDetails(Collection<? extends PersistableBusinessObject> objectCodeGlobalDetails) {
539         if (objectCodeGlobalDetails == null || objectCodeGlobalDetails.size() == 0) {
540             putFieldError(KFSConstants.MAINTENANCE_ADD_PREFIX + KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "." + KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_NO_CHART_FISCAL_YEAR);
541             return false;
542         }
543         return true;
544     }
545 
546     
547 
548 
549 
550 
551 
552     protected boolean checkFiscalYearAllLines(ObjectCodeGlobal objectCodeGlobal) {
553         boolean success = true;
554         int i = 0;
555         for (ObjectCodeGlobalDetail objectCodeGlobalDetail : objectCodeGlobal.getObjectCodeGlobalDetails()) {
556 
557             
558             success &= checkFiscalYear(objectCodeGlobal, objectCodeGlobalDetail, i, false);
559 
560             
561             i++;
562         }
563 
564         return success;
565     }
566 
567     
568 
569 
570 
571 
572 
573 
574     protected boolean checkChartAllLines(ObjectCodeGlobal ocChangeDocument) {
575         boolean success = true;
576         int i = 0;
577         for (ObjectCodeGlobalDetail objectCodeGlobalDetail : ocChangeDocument.getObjectCodeGlobalDetails()) {
578 
579             
580             success &= checkChartOnObjCodeDetails(ocChangeDocument, objectCodeGlobalDetail, i, false);
581             
582             i++;
583         }
584 
585         return success;
586     }
587 
588 
589     
590 
591 
592 
593 
594 
595 
596     protected boolean checkReportsToObjectCodeAllLines(ObjectCodeGlobal objectCodeGlobalDocument2) {
597         boolean success = true;
598         int i = 0;
599         for (ObjectCodeGlobalDetail objectCodeGlobalDetail : objectCodeGlobal.getObjectCodeGlobalDetails()) {
600 
601             
602             success &= checkReportsToObjectCode(objectCodeGlobal, objectCodeGlobalDetail, i, false);
603 
604             
605             i++;
606         }
607 
608         return success;
609     }
610 
611     
612 
613 
614 
615 
616 
617 
618     protected boolean checkNextYearObjectCodeAllLines(ObjectCodeGlobal objectCodeGlobalDocument2) {
619         boolean success = true;
620         int i = 0;
621         for (ObjectCodeGlobalDetail objectCodeGlobalDetail : objectCodeGlobal.getObjectCodeGlobalDetails()) {
622 
623             
624             success &= checkNextYearObjectCode(objectCodeGlobal, objectCodeGlobalDetail, i, false);
625 
626             
627             i++;
628         }
629 
630         return success;
631     }
632 
633     
634 
635 
636 
637 
638 
639 
640     protected boolean checkObjectLevelCodeAllLines(ObjectCodeGlobal objectCodeGlobalDocument2) {
641         boolean success = true;
642         int i = 0;
643         for (ObjectCodeGlobalDetail objectCodeGlobalDetail : objectCodeGlobal.getObjectCodeGlobalDetails()) {
644 
645             
646             success &= checkObjectLevelCode(objectCodeGlobal, objectCodeGlobalDetail, i, false);
647 
648             
649             i++;
650         }
651 
652         return success;
653     }
654 
655     
656 
657 
658 
659 
660 
661 
662 
663 
664     protected boolean checkFiscalYear(ObjectCodeGlobal objectCodeGlobal, ObjectCodeGlobalDetail objectCodeGlobalDetail, int lineNum, boolean add) {
665         boolean success = true;
666         String errorPath = KFSConstants.EMPTY_STRING;
667         
668         if (objectCodeGlobalDetail.getUniversityFiscalYear() == null) {
669             if (add) {
670                 errorPath = KFSConstants.MAINTENANCE_ADD_PREFIX + KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "." + "universityFiscalYear";
671                 putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_FISCAL_YEAR_MUST_EXIST);
672             }
673             else {
674                 errorPath = KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "[" + lineNum + "]." + "universityFiscalYear";
675                 putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_FISCAL_YEAR_MUST_EXIST);
676             }
677             success &= false;
678             return success;
679         }
680 
681         return success;
682     }
683 
684     
685 
686 
687 
688 
689 
690 
691 
692 
693     protected boolean checkChartOnObjCodeDetails(ObjectCodeGlobal objectCodeGlobal, ObjectCodeGlobalDetail objectCodeGlobalDetail, int lineNum, boolean add) {
694         boolean success = true;
695         String errorPath = KFSConstants.EMPTY_STRING;
696         
697         if (objectCodeGlobalDetail.getChartOfAccounts() == null) {
698             if (add) {
699                 errorPath = KFSConstants.MAINTENANCE_ADD_PREFIX + KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "." + "chartOfAccountsCode";
700                 putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_CHART_MUST_EXIST);
701             }
702             else {
703                 errorPath = KFSPropertyConstants.OBJECT_CODE_GLOBAL_DETAILS + "[" + lineNum + "]." + "chartOfAccountsCode";
704                 putFieldError(errorPath, KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_OBJECTMAINT_CHART_MUST_EXIST);
705             }
706             success &= false;
707             return success;
708         }
709 
710         return success;
711     }
712 
713     protected void setObjectCodeService(ObjectCodeService objectCodeService) {
714         this.objectCodeService = objectCodeService;
715 
716     }
717 
718 
719     protected void setObjectLevelService(ObjectLevelService objectLevelService) {
720         this.objectLevelService = objectLevelService;
721 
722     }
723 }