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.purap.service.impl;
017    
018    import java.math.BigDecimal;
019    import java.util.ArrayList;
020    import java.util.List;
021    
022    import org.apache.commons.lang.builder.EqualsBuilder;
023    import org.apache.commons.lang.builder.HashCodeBuilder;
024    import org.kuali.kfs.module.purap.businessobject.PurApAccountingLineBase;
025    import org.kuali.rice.kns.util.KualiDecimal;
026    
027    
028    /**
029     * Purap account history grouping
030     */
031    public class PurapAccountRevisionGroup {
032        protected String chartOfAccountsCode;
033        protected String accountNumber;
034        protected String subAccountNumber;
035        protected String financialObjectCode;
036        protected String financialSubObjectCode;
037        protected Integer postingYear;
038        protected String postingPeriodCode;
039        protected KualiDecimal amount;
040        protected Integer itemIdentifier;
041        private List<PurApAccountingLineBase> sourceEntries = new ArrayList<PurApAccountingLineBase>();
042        private KualiDecimal changeAmount;
043        // non-key attributes
044        private String projectCode;
045        private String organizationReferenceId;
046        private BigDecimal accountLinePercent;
047    
048    
049        public PurapAccountRevisionGroup(PurApAccountingLineBase entry) {
050            setChartOfAccountsCode(entry.getChartOfAccountsCode());
051            setAccountNumber(entry.getAccountNumber());
052            setSubAccountNumber(entry.getSubAccountNumber());
053            setFinancialObjectCode(entry.getFinancialObjectCode());
054            setFinancialSubObjectCode(entry.getFinancialSubObjectCode());
055            setItemIdentifier(entry.getItemIdentifier());
056            setPostingYear(entry.getPostingYear());
057            setPostingPeriodCode(entry.getPostingPeriodCode());
058            setProjectCode(entry.getProjectCode());
059            setOrganizationReferenceId(entry.getOrganizationReferenceId());
060            setAccountLinePercent(entry.getAccountLinePercent());
061            this.sourceEntries.add(entry);
062            setAmount(entry.getAmount());
063        }
064    
065    
066        /**
067         * Gets the chartOfAccountsCode attribute.
068         * 
069         * @return Returns the chartOfAccountsCode
070         */
071        public String getChartOfAccountsCode() {
072            return chartOfAccountsCode;
073        }
074    
075        /**
076         * Sets the chartOfAccountsCode attribute.
077         * 
078         * @param chartOfAccountsCode The chartOfAccountsCode to set.
079         */
080        public void setChartOfAccountsCode(String chartOfAccountsCode) {
081            this.chartOfAccountsCode = chartOfAccountsCode;
082        }
083    
084        /**
085         * Gets the accountNumber attribute.
086         * 
087         * @return Returns the accountNumber
088         */
089        public String getAccountNumber() {
090            return accountNumber;
091        }
092    
093        /**
094         * Sets the accountNumber attribute.
095         * 
096         * @param accountNumber The accountNumber to set.
097         */
098        public void setAccountNumber(String accountNumber) {
099            this.accountNumber = accountNumber;
100        }
101    
102        /**
103         * Gets the subAccountNumber attribute.
104         * 
105         * @return Returns the subAccountNumber
106         */
107        public String getSubAccountNumber() {
108            return subAccountNumber;
109        }
110    
111        /**
112         * Sets the subAccountNumber attribute.
113         * 
114         * @param subAccountNumber The subAccountNumber to set.
115         */
116        public void setSubAccountNumber(String subAccountNumber) {
117            this.subAccountNumber = subAccountNumber;
118        }
119    
120        /**
121         * Gets the financialObjectCode attribute.
122         * 
123         * @return Returns the financialObjectCode
124         */
125        public String getFinancialObjectCode() {
126            return financialObjectCode;
127        }
128    
129        /**
130         * Sets the financialObjectCode attribute.
131         * 
132         * @param financialObjectCode The financialObjectCode to set.
133         */
134        public void setFinancialObjectCode(String financialObjectCode) {
135            this.financialObjectCode = financialObjectCode;
136        }
137    
138        /**
139         * Gets the financialSubObjectCode attribute.
140         * 
141         * @return Returns the financialSubObjectCode
142         */
143        public String getFinancialSubObjectCode() {
144            return financialSubObjectCode;
145        }
146    
147        /**
148         * Sets the financialSubObjectCode attribute.
149         * 
150         * @param financialSubObjectCode The financialSubObjectCode to set.
151         */
152        public void setFinancialSubObjectCode(String financialSubObjectCode) {
153            this.financialSubObjectCode = financialSubObjectCode;
154        }
155    
156    
157        /**
158         * Gets the postingYear attribute.
159         * 
160         * @return Returns the postingYear.
161         */
162        public Integer getPostingYear() {
163            return postingYear;
164        }
165    
166    
167        /**
168         * Sets the postingYear attribute value.
169         * 
170         * @param postingYear The postingYear to set.
171         */
172        public void setPostingYear(Integer postingYear) {
173            this.postingYear = postingYear;
174        }
175    
176    
177        /**
178         * Gets the postingPeriodCode attribute.
179         * 
180         * @return Returns the postingPeriodCode.
181         */
182        public String getPostingPeriodCode() {
183            return postingPeriodCode;
184        }
185    
186    
187        /**
188         * Sets the postingPeriodCode attribute value.
189         * 
190         * @param postingPeriodCode The postingPeriodCode to set.
191         */
192        public void setPostingPeriodCode(String postingPeriodCode) {
193            this.postingPeriodCode = postingPeriodCode;
194        }
195    
196    
197        /**
198         * Overridden so that group by statement can be easily implemented.
199         * <li>DO NOT REMOVE this method, it is critical to reconciliation process</li>
200         * 
201         * @see java.lang.Object#equals(java.lang.Object)
202         */
203        @Override
204        public boolean equals(Object obj) {
205            if (this == obj) {
206                return true;
207            }
208            if (obj == null || !PurapAccountRevisionGroup.class.isAssignableFrom(obj.getClass())) {
209                return false;
210            }
211            PurapAccountRevisionGroup test = (PurapAccountRevisionGroup) obj;
212            EqualsBuilder equalsBuilder = new EqualsBuilder();
213            equalsBuilder.append(this.postingYear, test.getPostingYear());
214            equalsBuilder.append(itemIdentifier, test.getItemIdentifier());
215            equalsBuilder.append(replaceFiller(chartOfAccountsCode), replaceFiller(test.getChartOfAccountsCode()));
216            equalsBuilder.append(replaceFiller(accountNumber), replaceFiller(test.getAccountNumber()));
217            equalsBuilder.append(replaceFiller(subAccountNumber), replaceFiller(test.getSubAccountNumber()));
218            equalsBuilder.append(replaceFiller(financialObjectCode), replaceFiller(test.getFinancialObjectCode()));
219            equalsBuilder.append(replaceFiller(financialSubObjectCode), replaceFiller(test.getFinancialSubObjectCode()));
220            equalsBuilder.append(replaceFiller(postingPeriodCode), replaceFiller(test.getPostingPeriodCode()));
221            equalsBuilder.append(replaceFiller(projectCode), replaceFiller(test.getProjectCode()));
222            equalsBuilder.append(replaceFiller(organizationReferenceId), replaceFiller(test.getOrganizationReferenceId()));
223            return equalsBuilder.isEquals();
224        }
225    
226        protected String replaceFiller(String val) {
227            if (val == null) {
228                return "";
229            }
230            char[] charArray = val.trim().toCharArray();
231            for (char c : charArray) {
232                if (c != '-') {
233                    return val;
234                }
235            }
236            return "";
237        }
238    
239        /**
240         * Overridden so that group by statement can be easily implemented.
241         * <li>DO NOT REMOVE this method, it is critical to reconciliation process</li>
242         * 
243         * @see java.lang.Object#hashCode(java.lang.Object)
244         */
245        @Override
246        public int hashCode() {
247            HashCodeBuilder hashCodeBuilder = new HashCodeBuilder(37, 41);
248            hashCodeBuilder.append(this.postingYear);
249            hashCodeBuilder.append(itemIdentifier);
250            hashCodeBuilder.append(replaceFiller(chartOfAccountsCode));
251            hashCodeBuilder.append(replaceFiller(accountNumber));
252            hashCodeBuilder.append(replaceFiller(subAccountNumber));
253            hashCodeBuilder.append(replaceFiller(financialObjectCode));
254            hashCodeBuilder.append(replaceFiller(financialSubObjectCode));
255            hashCodeBuilder.append(replaceFiller(postingPeriodCode));
256            hashCodeBuilder.append(replaceFiller(projectCode));
257            hashCodeBuilder.append(replaceFiller(organizationReferenceId));
258            return hashCodeBuilder.toHashCode();
259        }
260    
261        /**
262         * Gets the absAmout attribute.
263         * 
264         * @return Returns the absAmout
265         */
266    
267        public KualiDecimal getAmount() {
268            return amount;
269        }
270    
271        /**
272         * Sets the amount attribute.
273         * 
274         * @param amount The amount to set.
275         */
276    
277        public void setAmount(KualiDecimal absAmount) {
278            this.amount = absAmount;
279        }
280    
281        @Override
282        public String toString() {
283            return "" + postingYear + "-" + chartOfAccountsCode + "-" + accountNumber + "-" + replaceFiller(subAccountNumber) + "-" + financialObjectCode + "-" + replaceFiller(financialSubObjectCode) + "-" + postingPeriodCode + "-" + itemIdentifier;
284        }
285    
286        /**
287         * Gets the itemIdentifier attribute.
288         * 
289         * @return Returns the itemIdentifier.
290         */
291        public Integer getItemIdentifier() {
292            return itemIdentifier;
293        }
294    
295        /**
296         * Sets the itemIdentifier attribute value.
297         * 
298         * @param itemIdentifier The itemIdentifier to set.
299         */
300        public void setItemIdentifier(Integer itemIdentifier) {
301            this.itemIdentifier = itemIdentifier;
302        }
303    
304        /**
305         * This method will combine multiple Purap account entries for the same account line group.
306         * 
307         * @param entry PurApAccountingLineBase
308         */
309        public void combineEntry(PurApAccountingLineBase newEntry) {
310            this.sourceEntries.add(newEntry);
311            this.amount = this.amount.add(newEntry.getAmount());
312        }
313    
314        /**
315         * Gets the changeAmount attribute.
316         * 
317         * @return Returns the changeAmount.
318         */
319        public KualiDecimal getChangeAmount() {
320            return changeAmount;
321        }
322    
323        /**
324         * Sets the changeAmount attribute value.
325         * 
326         * @param changeAmount The changeAmount to set.
327         */
328        public void setChangeAmount(KualiDecimal changeAmount) {
329            this.changeAmount = changeAmount;
330        }
331    
332    
333        /**
334         * Gets the projectCode attribute.
335         * 
336         * @return Returns the projectCode.
337         */
338        public String getProjectCode() {
339            return projectCode;
340        }
341    
342        /**
343         * Sets the projectCode attribute value.
344         * 
345         * @param projectCode The projectCode to set.
346         */
347        public void setProjectCode(String projectCode) {
348            this.projectCode = projectCode;
349        }
350    
351        /**
352         * Gets the organizationReferenceId attribute.
353         * 
354         * @return Returns the organizationReferenceId.
355         */
356        public String getOrganizationReferenceId() {
357            return organizationReferenceId;
358        }
359    
360        /**
361         * Sets the organizationReferenceId attribute value.
362         * 
363         * @param organizationReferenceId The organizationReferenceId to set.
364         */
365        public void setOrganizationReferenceId(String organizationReferenceId) {
366            this.organizationReferenceId = organizationReferenceId;
367        }
368    
369    
370        /**
371         * Gets the accountLinePercent attribute.
372         * 
373         * @return Returns the accountLinePercent.
374         */
375        public BigDecimal getAccountLinePercent() {
376            return accountLinePercent;
377        }
378    
379        /**
380         * Sets the accountLinePercent attribute value.
381         * 
382         * @param accountLinePercent The accountLinePercent to set.
383         */
384        public void setAccountLinePercent(BigDecimal accountLinePercent) {
385            this.accountLinePercent = accountLinePercent;
386        }
387    
388        public PurApAccountingLineBase buildRevisionRecord(Class<? extends PurApAccountingLineBase> clazz) {
389            PurApAccountingLineBase histRecord = null;
390            try {
391                histRecord = clazz.newInstance();
392                histRecord.setItemIdentifier(this.getItemIdentifier());
393                histRecord.setChartOfAccountsCode(this.getChartOfAccountsCode());
394                histRecord.setAccountNumber(this.getAccountNumber());
395                histRecord.setSubAccountNumber(this.getSubAccountNumber());
396                histRecord.setFinancialObjectCode(this.getFinancialObjectCode());
397                histRecord.setFinancialSubObjectCode(this.getFinancialSubObjectCode());
398                histRecord.setProjectCode(this.getProjectCode());
399                histRecord.setOrganizationReferenceId(this.getOrganizationReferenceId());
400                histRecord.setAmount(this.getChangeAmount());
401                histRecord.setPostingYear(this.getPostingYear());
402                histRecord.setPostingPeriodCode(this.getPostingPeriodCode());
403                histRecord.setAccountLinePercent(this.getAccountLinePercent());
404            }
405            catch (Exception e) {
406                throw new RuntimeException(e);
407            }
408            return histRecord;
409        }
410    }