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;
017    
018    import java.util.ArrayList;
019    import java.util.List;
020    
021    import org.kuali.kfs.module.endow.EndowConstants;
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.EndowmentTransactionLineParser;
026    import org.kuali.kfs.module.endow.util.LineParser;
027    import org.kuali.kfs.module.endow.util.LineParserBase;
028    import org.kuali.kfs.sys.KFSConstants;
029    import org.kuali.rice.kew.exception.WorkflowException;
030    import org.kuali.rice.kns.util.KualiDecimal;
031    import org.kuali.rice.kns.util.TypedArrayList;
032    
033    public abstract class EndowmentTransactionLinesDocumentBase extends EndowmentTransactionalDocumentBase implements EndowmentTransactionLinesDocument {
034    
035        protected Integer nextSourceLineNumber;
036        protected Integer nextTargetLineNumber;
037        protected List<EndowmentTransactionLine> sourceTransactionLines;
038        protected List<EndowmentTransactionLine> targetTransactionLines;
039    
040        /**
041         * Constructs a EndowmentTransactionLinesDocumentBase.java.
042         */
043        public EndowmentTransactionLinesDocumentBase() {
044            super();
045            this.nextSourceLineNumber = new Integer(1);
046            this.nextTargetLineNumber = new Integer(1);
047            sourceTransactionLines = new TypedArrayList(EndowmentSourceTransactionLine.class);
048            targetTransactionLines = new TypedArrayList(EndowmentTargetTransactionLine.class);
049        }
050        
051        /**
052         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getSourceTransactionLines()
053         */
054        public List<EndowmentTransactionLine> getSourceTransactionLines() {
055            return sourceTransactionLines;
056        }
057    
058        /**
059         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#setSourceTransactionLines(java.util.List)
060         */
061        public void setSourceTransactionLines(List<EndowmentTransactionLine> sourceTransactionLines) {
062            this.sourceTransactionLines = sourceTransactionLines;
063        }
064    
065        /**
066         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTargetTransactionLines()
067         */
068        public List<EndowmentTransactionLine> getTargetTransactionLines() {
069            return targetTransactionLines;
070        }
071    
072        /**
073         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#setTargetTransactionLines(java.util.List)
074         */
075        public void setTargetTransactionLines(List<EndowmentTransactionLine> targetTransactionLines) {
076            this.targetTransactionLines = targetTransactionLines;
077        }
078    
079        /**
080         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getSourceTransactionLinesSectionTitle()
081         */
082        public String getSourceTransactionLinesSectionTitle() {
083            return KFSConstants.SOURCE;
084    
085        }
086    
087        /**
088         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTargetTransactionLinesSectionTitle()
089         */
090        public String getTargetTransactionLinesSectionTitle() {
091            return KFSConstants.TARGET;
092        }
093    
094        /**
095         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getNextSourceLineNumber()
096         */
097        public Integer getNextSourceLineNumber() {
098            return nextSourceLineNumber;
099        }
100    
101        /**
102         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#setNextSourceLineNumber(java.lang.Integer)
103         */
104        public void setNextSourceLineNumber(Integer nextSourceLineNumber) {
105            this.nextSourceLineNumber = nextSourceLineNumber;
106        }
107    
108        /**
109         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getNextTargetLineNumber()
110         */
111        public Integer getNextTargetLineNumber() {
112            return nextTargetLineNumber;
113        }
114    
115        /**
116         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#setNextTargetLineNumber(java.lang.Integer)
117         */
118        public void setNextTargetLineNumber(Integer nextTargetLineNumber) {
119            this.nextTargetLineNumber = nextTargetLineNumber;
120        }
121    
122    
123        /**
124         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#addSourceTransactionLine(org.kuali.kfs.module.endow.businessobject.EndowmentSourceTransactionLine)
125         */
126        public void addSourceTransactionLine(EndowmentSourceTransactionLine line) {
127            line.setTransactionLineNumber(this.getNextSourceLineNumber());
128            this.sourceTransactionLines.add(line);
129            this.nextSourceLineNumber = new Integer(this.getNextSourceLineNumber().intValue() + 1);
130    
131        }
132    
133    
134        /**
135         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#addTargetTransactionLine(org.kuali.kfs.module.endow.businessobject.EndowmentTargetTransactionLine)
136         */
137        public void addTargetTransactionLine(EndowmentTargetTransactionLine line) {
138            line.setTransactionLineNumber(this.getNextTargetLineNumber());
139            this.targetTransactionLines.add(line);
140            this.nextTargetLineNumber = new Integer(this.getNextTargetLineNumber().intValue() + 1);
141        }
142    
143        /**
144         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getSourceIncomeTotal()
145         */
146        public KualiDecimal getSourceIncomeTotal() {
147            KualiDecimal total = KualiDecimal.ZERO;
148    
149            for (EndowmentTransactionLine tl : getSourceTransactionLines()) {
150                if (tl.getTransactionAmount() != null && EndowConstants.IncomePrincipalIndicator.INCOME.equalsIgnoreCase(tl.getTransactionIPIndicatorCode())) {
151                    total = total.add(tl.getTransactionAmount());
152                }
153            }
154    
155            return total;
156        }
157    
158    
159        /**
160         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getSourcePrincipalTotal()
161         */
162        public KualiDecimal getSourcePrincipalTotal() {
163            KualiDecimal total = KualiDecimal.ZERO;
164    
165            for (EndowmentTransactionLine tl : getSourceTransactionLines()) {
166                if (tl.getTransactionAmount() != null && EndowConstants.IncomePrincipalIndicator.PRINCIPAL.equalsIgnoreCase(tl.getTransactionIPIndicatorCode())) {
167                    total = total.add(tl.getTransactionAmount());
168                }
169            }
170    
171            return total;
172        }
173    
174    
175        /**
176         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTargetIncomeTotal()
177         */
178        public KualiDecimal getTargetIncomeTotal() {
179            KualiDecimal total = KualiDecimal.ZERO;
180    
181            for (EndowmentTransactionLine tl : getTargetTransactionLines()) {
182                if (tl.getTransactionAmount() != null && EndowConstants.IncomePrincipalIndicator.INCOME.equalsIgnoreCase(tl.getTransactionIPIndicatorCode())) {
183                    total = total.add(tl.getTransactionAmount());
184                }
185            }
186    
187            return total;
188        }
189    
190    
191        /**
192         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTargetPrincipalTotal()
193         */
194        public KualiDecimal getTargetPrincipalTotal() {
195            KualiDecimal total = KualiDecimal.ZERO;
196    
197            for (EndowmentTransactionLine tl : getTargetTransactionLines()) {
198                if (tl.getTransactionAmount() != null && EndowConstants.IncomePrincipalIndicator.PRINCIPAL.equalsIgnoreCase(tl.getTransactionIPIndicatorCode())) {
199                    total = total.add(tl.getTransactionAmount());
200                }
201            }
202    
203            return total;
204        }
205    
206        /**
207         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getSourceIncomeTotalUnits()
208         */
209        public KualiDecimal getSourceIncomeTotalUnits() {
210            KualiDecimal total = KualiDecimal.ZERO;
211    
212            for (EndowmentTransactionLine tl : getSourceTransactionLines()) {
213                if (tl.getTransactionUnits() != null && EndowConstants.IncomePrincipalIndicator.INCOME.equalsIgnoreCase(tl.getTransactionIPIndicatorCode())) {
214                    total = total.add(tl.getTransactionUnits());
215                }
216            }
217    
218            return total;
219        }
220    
221    
222        /**
223         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getSourcePrincipalTotalUnits()
224         */
225        public KualiDecimal getSourcePrincipalTotalUnits() {
226            KualiDecimal total = KualiDecimal.ZERO;
227    
228            for (EndowmentTransactionLine tl : getSourceTransactionLines()) {
229                if (tl.getTransactionUnits() != null && EndowConstants.IncomePrincipalIndicator.PRINCIPAL.equalsIgnoreCase(tl.getTransactionIPIndicatorCode())) {
230                    total = total.add(tl.getTransactionUnits());
231                }
232            }
233    
234            return total;
235        }
236    
237    
238        /**
239         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTargetIncomeTotalUnits()
240         */
241        public KualiDecimal getTargetIncomeTotalUnits() {
242            KualiDecimal total = KualiDecimal.ZERO;
243    
244            for (EndowmentTransactionLine tl : getTargetTransactionLines()) {
245                if (tl.getTransactionUnits() != null && EndowConstants.IncomePrincipalIndicator.INCOME.equalsIgnoreCase(tl.getTransactionIPIndicatorCode())) {
246                    total = total.add(tl.getTransactionUnits());
247                }
248            }
249    
250            return total;
251        }
252    
253    
254        /**
255         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTargetPrincipalTotalUnits()
256         */
257        public KualiDecimal getTargetPrincipalTotalUnits() {
258            KualiDecimal total = KualiDecimal.ZERO;
259    
260            for (EndowmentTransactionLine tl : getTargetTransactionLines()) {
261                if (tl.getTransactionUnits() != null && EndowConstants.IncomePrincipalIndicator.PRINCIPAL.equalsIgnoreCase(tl.getTransactionIPIndicatorCode())) {
262                    total = total.add(tl.getTransactionUnits());
263                }
264            }
265    
266            return total;
267        }
268    
269        /**
270         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTransactionLineParser()
271         */
272        public EndowmentTransactionLineParser getTransactionLineParser() {
273            // TODO Auto-generated method stub
274            return null;
275        }
276    
277    
278        /**
279         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getSourceTransactionLine(int)
280         */
281        public EndowmentSourceTransactionLine getSourceTransactionLine(int index) {
282            if (sourceTransactionLines != null && !sourceTransactionLines.isEmpty()) {                
283                if (index < sourceTransactionLines.size()) {
284                    return (EndowmentSourceTransactionLine) getSourceTransactionLines().get(index);
285                }
286            }
287            
288            return null;
289        }
290    
291        /**
292         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTargetTransactionLine(int)
293         */
294        public EndowmentTargetTransactionLine getTargetTransactionLine(int index) {
295            if (targetTransactionLines != null && !targetTransactionLines.isEmpty()) {                
296                if (index < targetTransactionLines.size()) {
297                    return (EndowmentTargetTransactionLine) getTargetTransactionLines().get(index);
298                }
299            }
300            
301            return null;
302        }
303    
304    
305        /**
306         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTargetTotalAmount()
307         */
308        public KualiDecimal getTargetTotalAmount() {
309            KualiDecimal totalAmount = KualiDecimal.ZERO;
310    
311            // totalAmount = TotalIncomeAmount + TotalPrincipalAmount
312            if (getTargetIncomeTotal() != null) {
313                totalAmount = totalAmount.add(getTargetIncomeTotal());
314            }
315            if (getTargetPrincipalTotal() != null) {
316                totalAmount = totalAmount.add(getTargetPrincipalTotal());
317            }
318    
319            return totalAmount;
320        }
321    
322    
323        /**
324         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getSourceTotalAmount()
325         */
326        public KualiDecimal getSourceTotalAmount() {
327            KualiDecimal totalAmount = KualiDecimal.ZERO;
328    
329            // totalAmount = TotalIncomeAmount + TotalPrincipalAmount
330            if (getSourceIncomeTotal() != null) {
331                totalAmount = totalAmount.add(getSourceIncomeTotal());
332            }
333            if (getSourcePrincipalTotal() != null) {
334                totalAmount = totalAmount.add(getSourcePrincipalTotal());
335            }
336    
337            return totalAmount;
338        }
339    
340    
341        /**
342         * Base implementation to compute the document total amount. Documents that display the total amount will implement the
343         * AmountTotaling interface and can override this method if needed.
344         * 
345         * @return the total units for the document
346         */
347        public KualiDecimal getTotalDollarAmount() {
348    
349            KualiDecimal totalAmount = KualiDecimal.ZERO;
350            if (getTargetTotalAmount() != null && getTargetTotalAmount().compareTo(KualiDecimal.ZERO) == 0) {
351                totalAmount = getSourceTotalAmount();
352            }
353            else if (getTargetTotalAmount() != null) {
354                totalAmount = getTargetTotalAmount();
355            }
356    
357            return totalAmount;
358    
359        }
360    
361    
362        /**
363         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getSourceTotalUnits()
364         */
365        public KualiDecimal getSourceTotalUnits() {
366            KualiDecimal totalUnits = KualiDecimal.ZERO;
367            // totalUnits = TotalIncomeUnits + TotalPrincipalUnits
368    
369            if (getSourceIncomeTotalUnits() != null) {
370                totalUnits = totalUnits.add(getSourceIncomeTotalUnits());
371            }
372    
373            if (getSourcePrincipalTotalUnits() != null) {
374                totalUnits = totalUnits.add(getSourcePrincipalTotalUnits());
375            }
376    
377            return totalUnits;
378        }
379    
380        /**
381         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTargetTotalUnits()
382         */
383        public KualiDecimal getTargetTotalUnits() {
384            KualiDecimal totalUnits = KualiDecimal.ZERO;
385            // totalUnits = TotalIncomeUnits + TotalPrincipalUnits
386            if (getTargetIncomeTotalUnits() != null) {
387                totalUnits = totalUnits.add(getTargetIncomeTotalUnits());
388            }
389    
390            if (getTargetPrincipalTotalUnits() != null) {
391                totalUnits = totalUnits.add(getTargetPrincipalTotalUnits());
392            }
393    
394            return totalUnits;
395        }
396    
397    
398        /**
399         * @see org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument#getTotalUnits()
400         */
401        public KualiDecimal getTotalUnits() {
402            KualiDecimal totalUnits = KualiDecimal.ZERO;
403            if (getTargetTotalUnits() != null && getTargetTotalUnits().compareTo(KualiDecimal.ZERO) == 0) {
404                totalUnits = getSourceTotalUnits();
405            }
406            else if (getTargetTotalUnits() != null) {
407                totalUnits = getTargetTotalUnits();
408            }
409    
410            return totalUnits;
411        }
412    
413        /**
414         * @see org.kuali.rice.kns.bo.PersistableBusinessObjectBase#buildListOfDeletionAwareLists()
415         */
416        @Override
417        public List buildListOfDeletionAwareLists() {
418            List managedList = super.buildListOfDeletionAwareLists();
419    
420            managedList.add(getTargetTransactionLines());
421            managedList.add(getSourceTransactionLines());
422    
423            return managedList;
424        }
425    
426        /**
427         * 
428         * @see org.kuali.rice.kns.document.DocumentBase#toCopy()
429         */
430        @Override
431        public void toCopy() throws WorkflowException {
432            super.toCopy();
433            
434            this.setTransactionPosted(false);
435            
436            List<EndowmentTransactionLine> lines = new ArrayList<EndowmentTransactionLine>();
437            if (sourceTransactionLines != null) lines.addAll(sourceTransactionLines);
438            if (targetTransactionLines != null) lines.addAll(targetTransactionLines);
439            
440            for (EndowmentTransactionLine line : lines) {
441                line.setLinePosted(false);
442            }       
443        } 
444        
445        /**
446         * @see org.kuali.kfs.sys.document.Correctable#toErrorCorrection()
447         */
448        @Override
449        public void toErrorCorrection() throws WorkflowException, IllegalStateException {
450            super.toErrorCorrection();
451    
452            this.setTransactionPosted(false);
453            
454            // Negate the Tx lines
455            List<EndowmentTransactionLine> lines = new ArrayList<EndowmentTransactionLine>();
456            lines.addAll(sourceTransactionLines);
457            lines.addAll(targetTransactionLines);
458    
459            for (EndowmentTransactionLine line : lines) {
460                line.setLinePosted(false);
461                line.setTransactionAmount(line.getTransactionAmount().negated());
462                if (null != line.getTransactionUnits() && !line.getTransactionUnits().isZero())
463                    line.setTransactionUnits(line.getTransactionUnits().negated());
464            }
465        }
466    
467        public Class getTranLineClass(boolean isSource) {
468            if (isSource)
469                return EndowmentSourceTransactionLine.class;
470            else
471                return EndowmentTargetTransactionLine.class;
472        }
473    
474        public LineParser getLineParser() {
475            return new LineParserBase();
476        }
477    }