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.bc.businessobject;
018    
019    import java.util.ArrayList;
020    import java.util.HashMap;
021    import java.util.LinkedHashMap;
022    import java.util.List;
023    import java.util.Map;
024    
025    import org.kuali.kfs.coa.businessobject.Account;
026    import org.kuali.kfs.coa.businessobject.BalanceType;
027    import org.kuali.kfs.coa.businessobject.Chart;
028    import org.kuali.kfs.coa.businessobject.ObjectCode;
029    import org.kuali.kfs.coa.businessobject.ObjectType;
030    import org.kuali.kfs.coa.businessobject.SubAccount;
031    import org.kuali.kfs.coa.businessobject.SubObjectCode;
032    import org.kuali.kfs.integration.ld.LaborLedgerObject;
033    import org.kuali.kfs.integration.ld.LaborLedgerPositionObjectBenefit;
034    import org.kuali.kfs.module.bc.util.SalarySettingCalculator;
035    import org.kuali.kfs.sys.KFSPropertyConstants;
036    import org.kuali.kfs.sys.ObjectUtil;
037    import org.kuali.kfs.sys.context.SpringContext;
038    import org.kuali.rice.kns.bo.PersistableBusinessObjectBase;
039    import org.kuali.rice.kns.service.BusinessObjectService;
040    import org.kuali.rice.kns.service.KualiModuleService;
041    import org.kuali.rice.kns.util.KualiDecimal;
042    import org.kuali.rice.kns.util.KualiInteger;
043    import org.kuali.rice.kns.util.TypedArrayList;
044    
045    public class PendingBudgetConstructionGeneralLedger extends PersistableBusinessObjectBase {
046    
047        private String documentNumber;
048        private Integer universityFiscalYear;
049        private String chartOfAccountsCode;
050        private String accountNumber;
051        private String subAccountNumber;
052        private String financialObjectCode;
053        private String financialSubObjectCode;
054        private String financialBalanceTypeCode;
055        private String financialObjectTypeCode;
056        private KualiInteger accountLineAnnualBalanceAmount;
057        private KualiInteger financialBeginningBalanceLineAmount;
058    
059        private BudgetConstructionHeader budgetConstructionHeader;
060        private ObjectCode financialObject;
061        private Chart chartOfAccounts;
062        private Account account;
063        private SubAccount subAccount;
064        private SubObjectCode financialSubObject;
065        private BalanceType balanceType;
066        private ObjectType objectType;
067    
068        private List<BudgetConstructionMonthly> budgetConstructionMonthly;
069    
070        // These are not defined under ojb since not all expenditure line objects have these
071        private LaborLedgerObject laborObject;
072        private List<LaborLedgerPositionObjectBenefit> positionObjectBenefit;
073    
074        private KualiDecimal adjustmentAmount;
075        private KualiDecimal percentChange;
076        private KualiInteger persistedAccountLineAnnualBalanceAmount;
077        private boolean pendingBudgetConstructionAppointmentFundingExists;
078    
079        /**
080         * Default constructor.
081         */
082        public PendingBudgetConstructionGeneralLedger() {
083            super();
084    
085            budgetConstructionMonthly = new TypedArrayList(BudgetConstructionMonthly.class);
086        }
087    
088        /**
089         * Gets the adjustmentAmount attribute. 
090         * @return Returns the adjustmentAmount.
091         */
092        public KualiDecimal getAdjustmentAmount() {
093            return adjustmentAmount;
094        }
095    
096        /**
097         * Sets the adjustmentAmount attribute value.
098         * @param adjustmentAmount The adjustmentAmount to set.
099         */
100        public void setAdjustmentAmount(KualiDecimal adjustmentAmount) {
101            this.adjustmentAmount = adjustmentAmount;
102        }
103    
104        /**
105         * Gets(sets) the percentChange based on the current values of base and request amounts
106         * 
107         * @return Returns percentChange
108         */
109        public KualiDecimal getPercentChange() {
110            KualiInteger baseAmount = this.getFinancialBeginningBalanceLineAmount();
111            KualiInteger requestedAmount = this.getAccountLineAnnualBalanceAmount();
112    
113            return SalarySettingCalculator.getPercentChange(baseAmount, requestedAmount);
114        }
115    
116        /**
117         * Sets the percentChange attribute value.
118         * 
119         * @param percentChange The percentChange to set.
120         */
121        public void setPercentChange(KualiDecimal percentChange) {
122            this.percentChange = percentChange;
123        }
124    
125        /**
126         * Gets the documentNumber attribute.
127         * 
128         * @return Returns the documentNumber
129         */
130        public String getDocumentNumber() {
131            return documentNumber;
132        }
133    
134        /**
135         * Sets the documentNumber attribute.
136         * 
137         * @param documentNumber The documentNumber to set.
138         */
139        public void setDocumentNumber(String documentNumber) {
140            this.documentNumber = documentNumber;
141        }
142    
143    
144        /**
145         * Gets the universityFiscalYear attribute.
146         * 
147         * @return Returns the universityFiscalYear
148         */
149        public Integer getUniversityFiscalYear() {
150            return universityFiscalYear;
151        }
152    
153        /**
154         * Sets the universityFiscalYear attribute.
155         * 
156         * @param universityFiscalYear The universityFiscalYear to set.
157         */
158        public void setUniversityFiscalYear(Integer universityFiscalYear) {
159            this.universityFiscalYear = universityFiscalYear;
160        }
161    
162    
163        /**
164         * Gets the chartOfAccountsCode attribute.
165         * 
166         * @return Returns the chartOfAccountsCode
167         */
168        public String getChartOfAccountsCode() {
169            return chartOfAccountsCode;
170        }
171    
172        /**
173         * Sets the chartOfAccountsCode attribute.
174         * 
175         * @param chartOfAccountsCode The chartOfAccountsCode to set.
176         */
177        public void setChartOfAccountsCode(String chartOfAccountsCode) {
178            this.chartOfAccountsCode = chartOfAccountsCode;
179        }
180    
181    
182        /**
183         * Gets the accountNumber attribute.
184         * 
185         * @return Returns the accountNumber
186         */
187        public String getAccountNumber() {
188            return accountNumber;
189        }
190    
191        /**
192         * Sets the accountNumber attribute.
193         * 
194         * @param accountNumber The accountNumber to set.
195         */
196        public void setAccountNumber(String accountNumber) {
197            this.accountNumber = accountNumber;
198        }
199    
200    
201        /**
202         * Gets the subAccountNumber attribute.
203         * 
204         * @return Returns the subAccountNumber
205         */
206        public String getSubAccountNumber() {
207            return subAccountNumber;
208        }
209    
210        /**
211         * Sets the subAccountNumber attribute.
212         * 
213         * @param subAccountNumber The subAccountNumber to set.
214         */
215        public void setSubAccountNumber(String subAccountNumber) {
216            this.subAccountNumber = subAccountNumber;
217        }
218    
219    
220        /**
221         * Gets the financialObjectCode attribute.
222         * 
223         * @return Returns the financialObjectCode
224         */
225        public String getFinancialObjectCode() {
226            return financialObjectCode;
227        }
228    
229        /**
230         * Sets the financialObjectCode attribute.
231         * 
232         * @param financialObjectCode The financialObjectCode to set.
233         */
234        public void setFinancialObjectCode(String financialObjectCode) {
235            this.financialObjectCode = financialObjectCode;
236        }
237    
238    
239        /**
240         * Gets the financialSubObjectCode attribute.
241         * 
242         * @return Returns the financialSubObjectCode
243         */
244        public String getFinancialSubObjectCode() {
245            return financialSubObjectCode;
246        }
247    
248        /**
249         * Sets the financialSubObjectCode attribute.
250         * 
251         * @param financialSubObjectCode The financialSubObjectCode to set.
252         */
253        public void setFinancialSubObjectCode(String financialSubObjectCode) {
254            this.financialSubObjectCode = financialSubObjectCode;
255        }
256    
257    
258        /**
259         * Gets the financialBalanceTypeCode attribute.
260         * 
261         * @return Returns the financialBalanceTypeCode
262         */
263        public String getFinancialBalanceTypeCode() {
264            return financialBalanceTypeCode;
265        }
266    
267        /**
268         * Sets the financialBalanceTypeCode attribute.
269         * 
270         * @param financialBalanceTypeCode The financialBalanceTypeCode to set.
271         */
272        public void setFinancialBalanceTypeCode(String financialBalanceTypeCode) {
273            this.financialBalanceTypeCode = financialBalanceTypeCode;
274        }
275    
276    
277        /**
278         * Gets the financialObjectTypeCode attribute.
279         * 
280         * @return Returns the financialObjectTypeCode
281         */
282        public String getFinancialObjectTypeCode() {
283            return financialObjectTypeCode;
284        }
285    
286        /**
287         * Sets the financialObjectTypeCode attribute.
288         * 
289         * @param financialObjectTypeCode The financialObjectTypeCode to set.
290         */
291        public void setFinancialObjectTypeCode(String financialObjectTypeCode) {
292            this.financialObjectTypeCode = financialObjectTypeCode;
293        }
294    
295    
296        /**
297         * Gets the accountLineAnnualBalanceAmount attribute.
298         * 
299         * @return Returns the accountLineAnnualBalanceAmount.
300         */
301        public KualiInteger getAccountLineAnnualBalanceAmount() {
302            if (accountLineAnnualBalanceAmount == null) {
303                accountLineAnnualBalanceAmount = KualiInteger.ZERO;
304            }
305            return accountLineAnnualBalanceAmount;
306        }
307    
308        /**
309         * Sets the accountLineAnnualBalanceAmount attribute value.
310         * 
311         * @param accountLineAnnualBalanceAmount The accountLineAnnualBalanceAmount to set.
312         */
313        public void setAccountLineAnnualBalanceAmount(KualiInteger accountLineAnnualBalanceAmount) {
314            this.accountLineAnnualBalanceAmount = accountLineAnnualBalanceAmount;
315        }
316    
317        /**
318         * Gets the persistedAccountLineAnnualBalanceAmount attribute.
319         * 
320         * @return Returns the persistedAccountLineAnnualBalanceAmount.
321         */
322        public KualiInteger getPersistedAccountLineAnnualBalanceAmount() {
323            return persistedAccountLineAnnualBalanceAmount;
324        }
325    
326        /**
327         * Sets the persistedAccountLineAnnualBalanceAmount attribute value.
328         * 
329         * @param persistedAccountLineAnnualBalanceAmount The persistedAccountLineAnnualBalanceAmount to set.
330         */
331        public void setPersistedAccountLineAnnualBalanceAmount(KualiInteger persistedAccountLineAnnualBalanceAmount) {
332            this.persistedAccountLineAnnualBalanceAmount = persistedAccountLineAnnualBalanceAmount;
333        }
334    
335        /**
336         * Gets the financialBeginningBalanceLineAmount attribute.
337         * 
338         * @return Returns the financialBeginningBalanceLineAmount.
339         */
340        public KualiInteger getFinancialBeginningBalanceLineAmount() {
341            return financialBeginningBalanceLineAmount;
342        }
343    
344        /**
345         * Sets the financialBeginningBalanceLineAmount attribute value.
346         * 
347         * @param financialBeginningBalanceLineAmount The financialBeginningBalanceLineAmount to set.
348         */
349        public void setFinancialBeginningBalanceLineAmount(KualiInteger financialBeginningBalanceLineAmount) {
350            this.financialBeginningBalanceLineAmount = financialBeginningBalanceLineAmount;
351        }
352    
353        /**
354         * Gets the budgetConstructionMonthly attribute.
355         * 
356         * @return Returns the budgetConstructionMonthly
357         */
358        public List<BudgetConstructionMonthly> getBudgetConstructionMonthly() {
359            return budgetConstructionMonthly;
360        }
361    
362        /**
363         * Sets the budgetConstructionMonthly attribute.
364         * 
365         * @param budgetConstructionMonthly The budgetConstructionMonthly to set.
366         * @deprecated
367         */
368        public void setBudgetConstructionMonthly(List<BudgetConstructionMonthly> budgetConstructionMonthly) {
369            this.budgetConstructionMonthly = budgetConstructionMonthly;
370        }
371    
372        /**
373         * Gets the financialObject attribute.
374         * 
375         * @return Returns the financialObject
376         */
377        public ObjectCode getFinancialObject() {
378            return financialObject;
379        }
380    
381        /**
382         * Sets the financialObject attribute.
383         * 
384         * @param financialObject The financialObject to set.
385         * @deprecated
386         */
387        public void setFinancialObject(ObjectCode financialObject) {
388            this.financialObject = financialObject;
389        }
390    
391        /**
392         * Gets the chartOfAccounts attribute.
393         * 
394         * @return Returns the chartOfAccounts
395         */
396        public Chart getChartOfAccounts() {
397            return chartOfAccounts;
398        }
399    
400        /**
401         * Sets the chartOfAccounts attribute.
402         * 
403         * @param chartOfAccounts The chartOfAccounts to set.
404         * @deprecated
405         */
406        public void setChartOfAccounts(Chart chartOfAccounts) {
407            this.chartOfAccounts = chartOfAccounts;
408        }
409    
410        /**
411         * Gets the account attribute.
412         * 
413         * @return Returns the account
414         */
415        public Account getAccount() {
416            return account;
417        }
418    
419        /**
420         * Sets the account attribute.
421         * 
422         * @param account The account to set.
423         * @deprecated
424         */
425        public void setAccount(Account account) {
426            this.account = account;
427        }
428    
429        /**
430         * Gets the financialSubObject attribute.
431         * 
432         * @return Returns the financialSubObject.
433         */
434        public SubObjectCode getFinancialSubObject() {
435            return financialSubObject;
436        }
437    
438        /**
439         * Sets the financialSubObject attribute value.
440         * 
441         * @param financialSubObject The financialSubObject to set.
442         * @deprecated
443         */
444        public void setFinancialSubObject(SubObjectCode financialSubObject) {
445            this.financialSubObject = financialSubObject;
446        }
447    
448        /**
449         * Gets the subAccount attribute.
450         * 
451         * @return Returns the subAccount.
452         */
453        public SubAccount getSubAccount() {
454            return subAccount;
455        }
456    
457        /**
458         * Sets the subAccount attribute value.
459         * 
460         * @param subAccount The subAccount to set.
461         * @deprecated
462         */
463        public void setSubAccount(SubAccount subAccount) {
464            this.subAccount = subAccount;
465        }
466    
467        /**
468         * Gets the balanceType attribute.
469         * 
470         * @return Returns the balanceType.
471         */
472        public BalanceType getBalanceType() {
473            return balanceType;
474        }
475    
476        /**
477         * Sets the balanceType attribute value.
478         * 
479         * @param balanceType The balanceType to set.
480         * @deprecated
481         */
482        public void setBalanceType(BalanceType balanceType) {
483            this.balanceType = balanceType;
484        }
485    
486        /**
487         * Gets the objectType attribute.
488         * 
489         * @return Returns the objectType.
490         */
491        public ObjectType getObjectType() {
492            return objectType;
493        }
494    
495        /**
496         * Sets the objectType attribute value.
497         * 
498         * @param objectType The objectType to set.
499         * @deprecated
500         */
501        public void setObjectType(ObjectType objectType) {
502            this.objectType = objectType;
503        }
504    
505        /**
506         * Gets the budgetConstructionHeader attribute.
507         * 
508         * @return Returns the budgetConstructionHeader.
509         */
510        public BudgetConstructionHeader getBudgetConstructionHeader() {
511            return budgetConstructionHeader;
512        }
513    
514        /**
515         * Sets the budgetConstructionHeader attribute value.
516         * 
517         * @param budgetConstructionHeader The budgetConstructionHeader to set.
518         * @deprecated
519         */
520        public void setBudgetConstructionHeader(BudgetConstructionHeader budgetConstructionHeader) {
521            this.budgetConstructionHeader = budgetConstructionHeader;
522        }
523    
524        /**
525         * Gets the laborObject attribute.
526         * 
527         * @return Returns the laborObject.
528         */
529        public LaborLedgerObject getLaborObject() {
530            laborObject = SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(LaborLedgerObject.class).retrieveExternalizableBusinessObjectIfNecessary(this, laborObject, "laborObject");
531            return laborObject;
532        }
533    
534        /**
535         * Sets the laborObject attribute value.
536         * 
537         * @param laborObject The laborObject to set.
538         */
539        public void setLaborObject(LaborLedgerObject laborObject) {
540            this.laborObject = laborObject;
541        }
542    
543        /**
544         * Gets the positionObjectBenefit attribute.
545         * 
546         * @return Returns the positionObjectBenefit.
547         */
548        public List<LaborLedgerPositionObjectBenefit> getPositionObjectBenefit() {
549            positionObjectBenefit = SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(LaborLedgerPositionObjectBenefit.class).retrieveExternalizableBusinessObjectsList(this, "positionObjectBenefit", LaborLedgerPositionObjectBenefit.class);
550            return positionObjectBenefit;
551        }
552    
553        /**
554         * Sets the positionObjectBenefit attribute value.
555         * 
556         * @param positionObjectBenefit The positionObjectBenefit to set.
557         */
558        public void setPositionObjectBenefit(List<LaborLedgerPositionObjectBenefit> positionObjectBenefit) {
559            this.positionObjectBenefit = positionObjectBenefit;
560        }
561    
562        /**
563         * Gets the pendingBudgetConstructionAppointmentFundingExists attribute.
564         * 
565         * @return Returns the pendingBudgetConstructionAppointmentFundingExists.
566         */
567        public boolean isPendingBudgetConstructionAppointmentFundingExists() {
568            pendingBudgetConstructionAppointmentFundingExists = false;
569    
570            if (this.getLaborObject() != null && this.getLaborObject().isDetailPositionRequiredIndicator()) {
571                Map<String, Object> fieldValues = new HashMap<String, Object>();
572    
573                fieldValues.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, getUniversityFiscalYear());
574                fieldValues.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, getChartOfAccountsCode());
575                fieldValues.put(KFSPropertyConstants.ACCOUNT_NUMBER, getAccountNumber());
576                fieldValues.put(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, getSubAccountNumber());
577                fieldValues.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, getFinancialObjectCode());
578                fieldValues.put(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, getFinancialSubObjectCode());
579    
580                int recCount = SpringContext.getBean(BusinessObjectService.class).countMatching(PendingBudgetConstructionAppointmentFunding.class, fieldValues);
581    
582                pendingBudgetConstructionAppointmentFundingExists = (recCount > 0) ? true : false;
583            }
584    
585            return pendingBudgetConstructionAppointmentFundingExists;
586        }
587    
588        /**
589         * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper()
590         */
591        protected LinkedHashMap toStringMapper() {
592            LinkedHashMap m = new LinkedHashMap();
593    
594            if (this.universityFiscalYear != null) {
595                m.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, this.universityFiscalYear.toString());
596            }
597    
598            m.put(KFSPropertyConstants.DOCUMENT_NUMBER, this.getDocumentNumber());
599            m.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, this.getChartOfAccountsCode());
600            m.put(KFSPropertyConstants.ACCOUNT_NUMBER, this.getAccountNumber());
601            m.put(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, this.getSubAccountNumber());
602            m.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, this.getFinancialObjectCode());
603            m.put(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, this.getFinancialSubObjectCode());
604            m.put(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, this.getFinancialBalanceTypeCode());
605            m.put(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE, this.getFinancialObjectTypeCode());
606    
607            return m;
608        }
609    
610        /**
611         * Returns a map with the primitive field names as the key and the primitive values as the map value.
612         * 
613         * @return Map
614         */
615        public Map<String, Object> getValuesMap() {
616            Map<String, Object> simpleValues = this.buildPrimaryKeyMap();
617    
618            return simpleValues;
619        }
620    
621        /**
622         * build the primary key map with the field names as the map keys and the field values as the map values
623         * 
624         * @return the primary key map with the field names as the map keys and the field values as the map values
625         */
626        public Map<String, Object> buildPrimaryKeyMap() {
627            return ObjectUtil.buildPropertyMap(this, getPrimaryKeyFields());
628        }
629        
630        /**
631         * get the list of primary keys
632         * @return the list of primary keys
633         */
634        public static List<String> getPrimaryKeyFields(){
635            List<String> primaryKeyFields = new ArrayList<String>();
636            primaryKeyFields.add(KFSPropertyConstants.DOCUMENT_NUMBER);
637            primaryKeyFields.add(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
638            primaryKeyFields.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
639            primaryKeyFields.add(KFSPropertyConstants.ACCOUNT_NUMBER);
640            primaryKeyFields.add(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
641            primaryKeyFields.add(KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
642            primaryKeyFields.add(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE);
643            primaryKeyFields.add(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE);
644            primaryKeyFields.add(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE);
645            
646            return primaryKeyFields;
647        }
648    }