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    
017    package org.kuali.kfs.module.ec.document;
018    
019    import java.util.ArrayList;
020    import java.util.LinkedHashMap;
021    import java.util.List;
022    
023    import org.apache.commons.lang.StringUtils;
024    import org.kuali.kfs.coa.businessobject.Organization;
025    import org.kuali.kfs.module.ec.businessobject.EffortCertificationDetail;
026    import org.kuali.kfs.module.ec.businessobject.EffortCertificationReportDefinition;
027    import org.kuali.kfs.module.ec.service.EffortCertificationDocumentService;
028    import org.kuali.kfs.module.ec.util.EffortCertificationParameterFinder;
029    import org.kuali.kfs.sys.KFSConstants;
030    import org.kuali.kfs.sys.KFSPropertyConstants;
031    import org.kuali.kfs.sys.businessobject.SystemOptions;
032    import org.kuali.kfs.sys.context.SpringContext;
033    import org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase;
034    import org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO;
035    import org.kuali.rice.kim.bo.Person;
036    import org.kuali.rice.kim.service.PersonService;
037    import org.kuali.rice.kns.UserSession;
038    import org.kuali.rice.kns.service.ParameterConstants.COMPONENT;
039    import org.kuali.rice.kns.util.GlobalVariables;
040    import org.kuali.rice.kns.util.KualiDecimal;
041    import org.kuali.rice.kns.util.ObjectUtils;
042    import org.kuali.rice.kns.util.TypedArrayList;
043    import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
044    
045    /**
046     * Effort Certification Document Class.
047     */
048    @COMPONENT(component="EffortCertification")
049    public class EffortCertificationDocument extends FinancialSystemTransactionalDocumentBase  {
050        protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(EffortCertificationDocument.class);
051    
052        protected static final String DO_AWARD_SPLIT = "DoAwardSplit";
053        protected static final String DO_RECREATE_SPLIT = "DoRecreateSplit";
054        
055        protected String effortCertificationReportNumber;
056        protected boolean effortCertificationDocumentCode;
057        protected Integer universityFiscalYear;
058        protected String emplid;
059        protected String organizationCode;    
060        protected KualiDecimal financialDocumentTotalAmount;
061    
062        protected Integer totalEffortPercent;
063        protected Integer totalOriginalEffortPercent;
064        protected KualiDecimal totalPayrollAmount;
065        protected KualiDecimal totalOriginalPayrollAmount;
066    
067        protected EffortCertificationReportDefinition effortCertificationReportDefinition;
068        protected Person employee;
069        protected Organization organization;
070        protected SystemOptions options;
071    
072        protected List<EffortCertificationDetail> effortCertificationDetailLines;
073        protected List<EffortCertificationDetail> summarizedDetailLines;
074        
075        protected Person ledgerPerson;
076        
077        /**
078         * Default constructor.
079         */
080        public EffortCertificationDocument() {
081            super();
082            
083            effortCertificationDetailLines = new TypedArrayList(EffortCertificationDetail.class);
084            summarizedDetailLines = new TypedArrayList(EffortCertificationDetail.class);
085        }
086    
087        /**
088         * Gets the effortCertificationReportNumber attribute.
089         * 
090         * @return Returns the effortCertificationReportNumber.
091         */
092        public String getEffortCertificationReportNumber() {
093            return effortCertificationReportNumber;
094        }
095    
096        /**
097         * Sets the effortCertificationReportNumber attribute value.
098         * 
099         * @param effortCertificationReportNumber The effortCertificationReportNumber to set.
100         */
101        public void setEffortCertificationReportNumber(String effortCertificationReportNumber) {
102            this.effortCertificationReportNumber = effortCertificationReportNumber;
103        }
104    
105        /**
106         * Gets the effortCertificationDocumentCode attribute.
107         * 
108         * @return Returns the effortCertificationDocumentCode.
109         */
110        public boolean getEffortCertificationDocumentCode() {
111            return effortCertificationDocumentCode;
112        }
113    
114        /**
115         * Sets the effortCertificationDocumentCode attribute value.
116         * 
117         * @param effortCertificationDocumentCode The effortCertificationDocumentCode to set.
118         */
119        public void setEffortCertificationDocumentCode(boolean effortCertificationDocumentCode) {
120            this.effortCertificationDocumentCode = effortCertificationDocumentCode;
121        }
122    
123        /**
124         * Gets the universityFiscalYear attribute.
125         * 
126         * @return Returns the universityFiscalYear.
127         */
128        public Integer getUniversityFiscalYear() {
129            return universityFiscalYear;
130        }
131    
132        /**
133         * Sets the universityFiscalYear attribute value.
134         * 
135         * @param universityFiscalYear The universityFiscalYear to set.
136         */
137        public void setUniversityFiscalYear(Integer universityFiscalYear) {
138            this.universityFiscalYear = universityFiscalYear;
139        }
140    
141        /**
142         * Gets the organizationCode attribute.
143         * 
144         * @return Returns the organizationCode.
145         */
146        public String getOrganizationCode() {
147            return organizationCode;
148        }
149    
150        /**
151         * Sets the organizationCode attribute value.
152         * 
153         * @param organizationCode The organizationCode to set.
154         */
155        public void setOrganizationCode(String organizationCode) {
156            this.organizationCode = organizationCode;
157        }
158    
159        /**
160         * Gets the organization attribute.
161         * 
162         * @return Returns the organization.
163         */
164        public Organization getOrganization() {
165            return organization;
166        }
167    
168        /**
169         * Sets the organization attribute value.
170         * 
171         * @param organization The organization to set.
172         */
173        public void setOrganization(Organization organization) {
174            this.organization = organization;
175        }
176        
177        /**
178         * Gets the emplid attribute.
179         * 
180         * @return Returns the emplid.
181         */
182        public String getEmplid() {
183            return emplid;
184        }
185    
186        /**
187         * Sets the emplid attribute value.
188         * 
189         * @param emplid The emplid to set.
190         */
191        public void setEmplid(String emplid) {
192            this.emplid = emplid;
193        }
194    
195        /**
196         * Gets the effortCertificationReportDefinition attribute.
197         * 
198         * @return Returns the effortCertificationReportDefinition.
199         */
200        public EffortCertificationReportDefinition getEffortCertificationReportDefinition() {
201            return effortCertificationReportDefinition;
202        }
203    
204        /**
205         * Sets the effortCertificationReportDefinition attribute value.
206         * 
207         * @param effortCertificationReportDefinition The effortCertificationReportDefinition to set.
208         */
209        @Deprecated
210        public void setEffortCertificationReportDefinition(EffortCertificationReportDefinition effortCertificationReportDefinition) {
211            this.effortCertificationReportDefinition = effortCertificationReportDefinition;
212        }
213    
214        /**
215         * Gets the employee attribute.
216         * 
217         * @return Returns the employee.
218         */
219        public Person getEmployee() {
220            return (Person) SpringContext.getBean(PersonService.class).getPersonByEmployeeId(getEmplid());
221        }
222    
223        /**
224         * Sets the employee attribute value.
225         * 
226         * @param employee The employee to set.
227         */
228        public void setEmployee(Person employee) {
229            this.employee = employee;
230        }
231    
232        /**
233         * Gets the Person
234         * 
235         * @return Returns the Person
236         */
237        public Person getLedgerPerson() {
238            if(ledgerPerson == null || !StringUtils.equals(ledgerPerson.getEmployeeId(), emplid)) {
239                ledgerPerson = SpringContext.getBean(PersonService.class).getPersonByEmployeeId(emplid);
240            }
241            
242            return ledgerPerson;
243        }
244    
245        /**
246         * Sets the ledgerPerson
247         * 
248         * @param ledgerPerson The ledgerPerson to set.
249         */
250        public void setLedgerPerson(Person ledgerPerson) {
251            this.ledgerPerson = ledgerPerson;
252        }
253        
254        /**
255         * Gets the options attribute.
256         * 
257         * @return Returns the options.
258         */
259        public SystemOptions getOptions() {
260            return options;
261        }
262    
263        /**
264         * Sets the options attribute value.
265         * 
266         * @param options The options to set.
267         */
268        public void setOptions(SystemOptions options) {
269            this.options = options;
270        }
271    
272        /**
273         * Gets the effortCertificationDetailLines attribute.
274         * 
275         * @return Returns the effortCertificationDetailLines.
276         */
277        public List<EffortCertificationDetail> getEffortCertificationDetailLines() {
278            return effortCertificationDetailLines;
279        }
280    
281        /**
282         * Sets the effortCertificationDetailLines attribute value.
283         * 
284         * @param effortCertificationDetailLines The effortCertificationDetailLines to set.
285         */
286        @Deprecated
287        public void setEffortCertificationDetailLines(List<EffortCertificationDetail> effortCertificationDetailLines) {
288            this.effortCertificationDetailLines = effortCertificationDetailLines;
289        }
290    
291    
292        /**
293         * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper()
294         */
295        @SuppressWarnings("unchecked")
296        protected LinkedHashMap toStringMapper() {
297            LinkedHashMap m = new LinkedHashMap();
298            m.put(KFSPropertyConstants.DOCUMENT_NUMBER, this.documentNumber);
299            return m;
300        }
301    
302        /**
303         * get the total amount of the given effort certification document
304         * 
305         * @param effortCertificationDocument the given effort certification document
306         * @return the total amount of the given effort certification document
307         */
308        public static KualiDecimal getDocumentTotalAmount(EffortCertificationDocument effortCertificationDocument) {
309            List<EffortCertificationDetail> detailLines = effortCertificationDocument.getEffortCertificationDetailLines();
310            return EffortCertificationDetail.getTotalPayrollAmount(detailLines);
311        }
312    
313        /**
314         * @see org.kuali.rice.kns.document.DocumentBase#doRouteStatusChange()
315         */
316        @Override
317        public void doRouteStatusChange(DocumentRouteStatusChangeDTO statusChangeEvent) {
318            LOG.debug("doRouteStatusChange() start...");
319    
320            super.doRouteStatusChange(statusChangeEvent);
321            KualiWorkflowDocument workflowDocument = this.getDocumentHeader().getWorkflowDocument();
322            if (workflowDocument.stateIsFinal()) {
323                GlobalVariables.setUserSession(new UserSession(KFSConstants.SYSTEM_USER));
324                SpringContext.getBean(EffortCertificationDocumentService.class).generateSalaryExpenseTransferDocument(this);
325            }
326            //           SpringContext.getBean(EffortCertificationDocumentService.class).processApprovedEffortCertificationDocument(this);
327        }
328    
329        /**
330         * Gets the totalEffortPercent attribute.
331         * 
332         * @return Returns the totalEffortPercent.
333         */
334        public Integer getTotalEffortPercent() {
335            return EffortCertificationDetail.getTotalEffortPercent(this.getEffortCertificationDetailLines());
336        }
337    
338        /**
339         * Gets the totalOriginalEffortPercent attribute.
340         * 
341         * @return Returns the totalOriginalEffortPercent.
342         */
343        public Integer getTotalOriginalEffortPercent() {
344            return EffortCertificationDetail.getTotalOriginalEffortPercent(this.getEffortCertificationDetailLines());
345        }
346    
347        /**
348         * Gets the totalPayrollAmount attribute.
349         * 
350         * @return Returns the totalPayrollAmount.
351         */
352        public KualiDecimal getTotalPayrollAmount() {
353            return EffortCertificationDetail.getTotalPayrollAmount(this.getEffortCertificationDetailLines());
354        }
355    
356        /**
357         * Gets the totalOriginalPayrollAmount attribute.
358         * 
359         * @return Returns the totalOriginalPayrollAmount.
360         */
361        public KualiDecimal getTotalOriginalPayrollAmount() {
362            return EffortCertificationDetail.getTotalOriginalPayrollAmount(this.getEffortCertificationDetailLines());
363        }
364    
365        /**
366         * find the detail lines that have max payroll amount
367         * 
368         * @return the detail lines that have max payroll amount
369         */
370        public List<EffortCertificationDetail> getEffortCertificationDetailWithMaxPayrollAmount() {
371            List<EffortCertificationDetail> detailLines = new ArrayList<EffortCertificationDetail>();
372    
373            KualiDecimal maxAmount = null;
374            for (EffortCertificationDetail line : this.getEffortCertificationDetailLines()) {
375                KualiDecimal currentAmount = line.getEffortCertificationPayrollAmount();
376    
377                if (maxAmount == null) {
378                    maxAmount = currentAmount;
379                    detailLines.add(line);
380                    continue;
381                }
382    
383                if (maxAmount.isLessThan(currentAmount)) {
384                    detailLines.removeAll(detailLines);
385                    maxAmount = currentAmount;
386                    detailLines.add(line);
387                }
388                else if (maxAmount.equals(currentAmount)) {
389                    detailLines.add(line);
390                }
391            }
392    
393            return detailLines;
394        }
395    
396        /**
397         * Calculates the total updated effort for all federal detail lines
398         * 
399         * @return effortFederalTotal
400         */
401        public Integer getFederalTotalEffortPercent() {
402            Integer effortFederalTotal = 0;
403            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
404    
405            for (EffortCertificationDetail detailLine : detailLineList) {
406                if (detailLine.isFederalOrFederalPassThroughIndicator()) {
407                    effortFederalTotal += detailLine.getEffortCertificationUpdatedOverallPercent();
408                }
409            }
410    
411            return effortFederalTotal;
412        }
413    
414        /**
415         * Calculates the total original effort for all federal detail lines
416         * 
417         * @return original federal total
418         */
419        public Integer getFederalTotalOriginalEffortPercent() {
420            Integer effortOrigFederalTotal = 0;
421            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
422    
423            for (EffortCertificationDetail detailLine : detailLineList) {
424                if (detailLine.isFederalOrFederalPassThroughIndicator()) {
425                    effortOrigFederalTotal += detailLine.getEffortCertificationCalculatedOverallPercent();
426                }
427            }
428    
429            return effortOrigFederalTotal;
430        }
431    
432        /**
433         * Calculates the total original fringe benefit amount for federal pass through detail lines
434         * 
435         * @return total federal benefit amount
436         */
437        public KualiDecimal getFederalTotalOriginalFringeBenefit() {
438            KualiDecimal totalBenAmount = KualiDecimal.ZERO;
439            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
440    
441            for (EffortCertificationDetail detailLine : detailLineList) {
442                if (detailLine.isFederalOrFederalPassThroughIndicator()) {
443                    totalBenAmount = totalBenAmount.add(detailLine.getOriginalFringeBenefitAmount());
444                }
445            }
446    
447            return totalBenAmount;
448        }
449    
450        /**
451         * Calculates total original fringe benenfit amount for non federal pass through detail lines
452         * 
453         * @return total non federal benefit amount
454         */
455        public KualiDecimal getOtherTotalOriginalFringeBenefit() {
456            KualiDecimal totalBenAmount = KualiDecimal.ZERO;
457            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
458    
459            for (EffortCertificationDetail detailLine : detailLineList) {
460                if (!detailLine.isFederalOrFederalPassThroughIndicator()) {
461                    totalBenAmount = totalBenAmount.add(detailLine.getOriginalFringeBenefitAmount());
462                }
463            }
464    
465            return totalBenAmount;
466        }
467    
468        /**
469         * Calculates the total fringe benefit amount for federal pass through detail lines
470         * 
471         * @return total federal benefit amount
472         */
473        public KualiDecimal getFederalTotalFringeBenefit() {
474            KualiDecimal totalBenAmount = KualiDecimal.ZERO;
475            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
476    
477            for (EffortCertificationDetail detailLine : detailLineList) {
478                if (detailLine.isFederalOrFederalPassThroughIndicator()) {
479                    totalBenAmount = totalBenAmount.add(detailLine.getFringeBenefitAmount());
480                }
481            }
482    
483            return totalBenAmount;
484        }
485    
486        /**
487         * Calculates total fringe benenfit amount for non federal pass through detail lines
488         * 
489         * @return total non federal benefit amount
490         */
491        public KualiDecimal getOtherTotalFringeBenefit() {
492            KualiDecimal totalBenAmount = KualiDecimal.ZERO;
493            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
494    
495            for (EffortCertificationDetail detailLine : detailLineList) {
496                if (!detailLine.isFederalOrFederalPassThroughIndicator()) {
497                    totalBenAmount = totalBenAmount.add(detailLine.getFringeBenefitAmount());
498                }
499            }
500    
501            return totalBenAmount;
502        }
503    
504        /**
505         * Calculates the total original effor for non federal pass through detail lines
506         * 
507         * @return original other total
508         */
509        public Integer getOtherTotalOriginalEffortPercent() {
510            Integer effortOrigOtherTotal = 0;
511            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
512    
513            for (EffortCertificationDetail detailLine : detailLineList) {
514                if (!detailLine.isFederalOrFederalPassThroughIndicator()) {
515                    effortOrigOtherTotal += detailLine.getEffortCertificationCalculatedOverallPercent();
516                }
517            }
518    
519            return effortOrigOtherTotal;
520        }
521    
522        /**
523         * Calculates the total updated effort for non federal pass through detail lines
524         * 
525         * @return effort total for non federal pass through accounts
526         */
527        public Integer getOtherTotalEffortPercent() {
528            Integer effortOtherTotal = 0;
529            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
530    
531            for (EffortCertificationDetail detailLine : detailLineList) {
532                if (!detailLine.isFederalOrFederalPassThroughIndicator()) {
533                    effortOtherTotal += detailLine.getEffortCertificationUpdatedOverallPercent();
534                }
535            }
536    
537            return effortOtherTotal;
538        }
539    
540        /**
541         * Calculates the total salary for federal detail lines
542         * 
543         * @return total salary
544         */
545        public KualiDecimal getFederalTotalPayrollAmount() {
546            KualiDecimal salaryFederalTotal = KualiDecimal.ZERO;
547            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
548    
549            for (EffortCertificationDetail detailLine : detailLineList) {
550                if (detailLine.isFederalOrFederalPassThroughIndicator()) {
551                    salaryFederalTotal = salaryFederalTotal.add(detailLine.getEffortCertificationPayrollAmount());
552                }
553            }
554    
555            return salaryFederalTotal;
556        }
557    
558        /**
559         * Calculates the total original salary for federal pass through detail lines
560         * 
561         * @return total salary
562         */
563        public KualiDecimal getFederalTotalOriginalPayrollAmount() {
564            KualiDecimal salaryOrigFederalTotal = KualiDecimal.ZERO;
565            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
566    
567            for (EffortCertificationDetail detailLine : detailLineList) {
568                if (detailLine.isFederalOrFederalPassThroughIndicator()) {
569                    salaryOrigFederalTotal = salaryOrigFederalTotal.add(detailLine.getEffortCertificationOriginalPayrollAmount());
570                }
571            }
572    
573            return salaryOrigFederalTotal;
574        }
575    
576        /**
577         * Calculates the total original salary for non federal pass through detail lines
578         * 
579         * @return total original salary
580         */
581        public KualiDecimal getOtherTotalOriginalPayrollAmount() {
582            KualiDecimal salaryOrigOtherTotal = KualiDecimal.ZERO;
583            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
584    
585            for (EffortCertificationDetail detailLine : detailLineList) {
586                if (!detailLine.isFederalOrFederalPassThroughIndicator()) {
587                    salaryOrigOtherTotal = salaryOrigOtherTotal.add(detailLine.getEffortCertificationOriginalPayrollAmount());
588                }
589            }
590    
591            return salaryOrigOtherTotal;
592        }
593    
594        /**
595         * Calculates total updated salary for non federal pass through detail lines
596         * 
597         * @return total salary
598         */
599        public KualiDecimal getOtherTotalPayrollAmount() {
600            KualiDecimal salaryOtherTotal = KualiDecimal.ZERO;
601            List<EffortCertificationDetail> detailLineList = this.getEffortCertificationDetailLines();
602    
603            for (EffortCertificationDetail detailLine : detailLineList) {
604                if (!detailLine.isFederalOrFederalPassThroughIndicator()) {
605                    salaryOtherTotal = salaryOtherTotal.add(detailLine.getEffortCertificationPayrollAmount());
606                }
607            }
608    
609            return salaryOtherTotal;
610        }
611    
612        /**
613         * Gets the totalFringeBenefit attribute.
614         * 
615         * @return Returns the totalFringeBenefit.
616         */
617        public KualiDecimal getTotalFringeBenefit() {
618            return EffortCertificationDetail.getTotalFringeBenefit(effortCertificationDetailLines);
619        }
620    
621        /**
622         * Gets the totalOriginalFringeBenefit attribute.
623         * 
624         * @return Returns the totalOriginalFringeBenefit.
625         */
626        public KualiDecimal getTotalOriginalFringeBenefit() {
627            return EffortCertificationDetail.getTotalOriginalFringeBenefit(effortCertificationDetailLines);
628        }
629    
630        /**
631         * @see org.kuali.rice.kns.document.DocumentBase#processAfterRetrieve()
632         */
633        @Override
634        public void processAfterRetrieve() {
635            super.processAfterRetrieve();
636    
637            // capture each line's salary amount before route level modification for later rule validation
638            for (EffortCertificationDetail detailLine : this.getEffortCertificationDetailLines()) {
639                detailLine.setPersistedPayrollAmount(new KualiDecimal(detailLine.getEffortCertificationPayrollAmount().bigDecimalValue()));
640                
641                int effortPercent = detailLine.getEffortCertificationUpdatedOverallPercent();
642                detailLine.setPersistedEffortPercent(new Integer(effortPercent));
643            }
644    
645            // calculate original fringe benefits for each line
646            for (EffortCertificationDetail detailLine : this.getEffortCertificationDetailLines()) {
647                detailLine.recalculateOriginalFringeBenefit();
648            }
649        }
650    
651        /**
652         * Checks if the effort has changed for any of the detail lines.
653         * 
654         * @return true if effort has changed, false otherwise
655         */
656        public boolean isEffortDistributionChanged() {
657            for (EffortCertificationDetail detail : this.getEffortCertificationDetailLines()) {
658                if (!detail.getEffortCertificationCalculatedOverallPercent().equals(detail.getEffortCertificationUpdatedOverallPercent())) {
659                    return true;
660                }
661            }
662    
663            return false;
664        }
665    
666        /**
667         * Finds the default position number for display based on the detail line with the maximum effort
668         * 
669         * @return default position number
670         */
671        public String getDefaultPositionNumber() {
672            return this.getMaxEffortLine().getPositionNumber();
673        }
674    
675        /**
676         * Finds the default object code for display based on the value for the detail line with the maximum effort
677         * 
678         * @return default object code
679         */
680        public String getDefaultObjectCode() {
681            return this.getMaxEffortLine().getFinancialObjectCode();
682        }
683    
684        /**
685         * Finds the detail line with the maximum effort
686         * 
687         * @return max effort line
688         */
689        protected EffortCertificationDetail getMaxEffortLine() {
690            Integer maxEffort = 0;
691            EffortCertificationDetail maxLine = null;
692            List<EffortCertificationDetail> detailLines = this.getEffortCertificationDetailLines();
693            for (EffortCertificationDetail detailLine : detailLines) {
694                if (detailLine.getEffortCertificationUpdatedOverallPercent() > maxEffort) {
695                    maxEffort = detailLine.getEffortCertificationUpdatedOverallPercent();
696                    maxLine = detailLine;
697                }
698            }
699            return maxLine;
700        }
701    
702        /**
703         * @see org.kuali.rice.kns.document.DocumentBase#populateDocumentForRouting()
704         */
705        @Override
706        public void populateDocumentForRouting() {
707            if (ObjectUtils.isNotNull(getTotalPayrollAmount())) {
708                getDocumentHeader().setFinancialDocumentTotalAmount(getTotalPayrollAmount());
709            }
710            else {
711                getDocumentHeader().setFinancialDocumentTotalAmount(new KualiDecimal(0));
712            }
713            super.populateDocumentForRouting();
714        }
715    
716    
717        /**
718         * Finds the list of unique object codes contained in this document
719         * 
720         * @return list of unique object codes
721         */
722        public List<String> getObjectCodeList() {
723            List<String> uniqueObjectCodeList = new ArrayList<String>();
724            List<EffortCertificationDetail> allObjectCodesList = this.getEffortCertificationDetailLines();
725            for (EffortCertificationDetail detail : allObjectCodesList) {
726                if (!uniqueObjectCodeList.contains(detail.getFinancialObjectCode())) {
727                    uniqueObjectCodeList.add(detail.getFinancialObjectCode());
728                }
729            }
730    
731            return uniqueObjectCodeList;
732        }
733    
734        /**
735         * Finds the list of unique position numbers for this document
736         * 
737         * @return list of unique position numbers
738         */
739        public List<String> getPositionList() {
740            List<String> uniquePositionList = new ArrayList<String>();
741            List<EffortCertificationDetail> allPositionsList = this.getEffortCertificationDetailLines();
742            for (EffortCertificationDetail detail : allPositionsList) {
743                if (!uniquePositionList.contains(detail.getPositionNumber())) {
744                    uniquePositionList.add(detail.getPositionNumber());
745                }
746            }
747    
748            return uniquePositionList;
749        }
750    
751        /**
752         * This is a marker setter method and does nothing.
753         */
754        public void setTotalOriginalPayrollAmount(KualiDecimal totalOriginalPayrollAmount) {
755            return;
756        }
757    
758        /**
759         * Gets the summarizedDetailLines attribute.
760         * 
761         * @return Returns the summarizedDetailLines.
762         */
763        public List<EffortCertificationDetail> getSummarizedDetailLines() {
764            return summarizedDetailLines;
765        }
766    
767        /**
768         * Sets the summarizedDetailLines attribute value.
769         * 
770         * @param summarizedDetailLines The summarizedDetailLines to set.
771         */
772        public void setSummarizedDetailLines(List<EffortCertificationDetail> summarizedDetailLines) {
773            this.summarizedDetailLines = summarizedDetailLines;
774        }
775        
776        /**
777         * Provides answers to the following splits:
778         * Do Award Split
779         * Do Recreate Split
780         * @see org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase#answerSplitNodeQuestion(java.lang.String)
781         */
782        @Override
783        public boolean answerSplitNodeQuestion(String nodeName) throws UnsupportedOperationException {
784            if (nodeName.equals(EffortCertificationDocument.DO_AWARD_SPLIT)) return isDoAwardSplit();
785            if (nodeName.equals(EffortCertificationDocument.DO_RECREATE_SPLIT)) return isDoRecreateSplit();
786            throw new UnsupportedOperationException("Cannot answer split question for this node you call \""+nodeName+"\"");
787        }
788        
789        /**
790         * Checks system parameter that indicates whether routing to project directors should occur only on
791         * lines with federal accounts or all lines. 
792         * 
793         * @return detail lines with federal accounts if parameter is true, otherwise all detail lines
794         */
795        public List<EffortCertificationDetail> getDetailLinesForPDRouting() {
796            boolean federalOnlyRouting = EffortCertificationParameterFinder.getFederalOnlyRouteIndicator();
797            if (!federalOnlyRouting) {
798                return this.effortCertificationDetailLines;
799            }
800            
801            List<EffortCertificationDetail> federalDetailLines = new ArrayList<EffortCertificationDetail>();
802            for (EffortCertificationDetail detail : this.effortCertificationDetailLines) {
803                if (detail.isFederalOrFederalPassThroughIndicator()) {
804                    federalDetailLines.add(detail);
805                }
806            }
807            
808            return federalDetailLines;
809        }
810        
811        /**
812         * @return boolean value 
813         */
814        protected boolean isDoAwardSplit() {
815            return this.isEffortDistributionChanged();
816        }
817        
818        /**
819         * @return boolean value
820         */
821        protected boolean isDoRecreateSplit() {
822            return this.getEffortCertificationDocumentCode();
823        } 
824    }
825