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.coa.service.impl;
017    
018    import java.sql.Date;
019    import java.util.Collection;
020    import java.util.HashMap;
021    import java.util.Map;
022    import java.util.Set;
023    import java.util.TreeSet;
024    
025    import org.kuali.kfs.coa.businessobject.AccountingPeriod;
026    import org.kuali.kfs.coa.service.AccountingPeriodService;
027    import org.kuali.kfs.sys.KFSConstants;
028    import org.kuali.kfs.sys.KFSPropertyConstants;
029    import org.kuali.kfs.sys.businessobject.UniversityDate;
030    import org.kuali.rice.kns.service.BusinessObjectService;
031    import org.kuali.rice.kns.service.DateTimeService;
032    import org.kuali.rice.kns.util.spring.Cached;
033    
034    /**
035     * This service implementation is the default implementation of the AccountingPeriod service that is delivered with Kuali.
036     */
037    public class AccountingPeriodServiceImpl implements AccountingPeriodService {
038        // member data
039        private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AccountingPeriodServiceImpl.class);
040        private BusinessObjectService businessObjectService;
041        private DateTimeService dateTimeService;
042    
043        protected static final Set _invalidPeriodCodes = new TreeSet();
044    
045        static {
046            _invalidPeriodCodes.add("13");
047            _invalidPeriodCodes.add("AB");
048            _invalidPeriodCodes.add("BB");
049            _invalidPeriodCodes.add("CB");
050        }
051    
052        /**
053         * The default implementation.
054         * 
055         * @see org.kuali.kfs.coa.service.AccountingPeriodService#getAllAccountingPeriods()
056         */
057        public Collection getAllAccountingPeriods() {
058            return businessObjectService.findAll(AccountingPeriod.class);
059        }
060    
061        /**
062         * Implements by choosing only accounting periods that are active.
063         * 
064         * @see org.kuali.kfs.coa.service.AccountingPeriodService#getOpenAccountingPeriods()
065         */
066        @Cached
067        public Collection getOpenAccountingPeriods() {
068            HashMap map = new HashMap();
069            map.put(KFSConstants.ACCOUNTING_PERIOD_ACTIVE_INDICATOR_FIELD, Boolean.TRUE);
070    
071            return businessObjectService.findMatchingOrderBy(AccountingPeriod.class, map, KFSPropertyConstants.ACCTING_PERIOD_UNIV_FISCAL_PERIOD_END_DATE, true);
072        }
073    
074        /**
075         * This method is a helper method to easily grab an accounting period by looking up it's period and fiscal year
076         * 
077         * @param periodCode
078         * @param fiscalYear
079         * @return an accounting period
080         */
081        @Cached
082        public AccountingPeriod getByPeriod(String periodCode, Integer fiscalYear) {
083            // build up the hashmap to find the accounting period
084            Map keys = new HashMap();
085            keys.put("universityFiscalPeriodCode", periodCode);
086            keys.put("universityFiscalYear", fiscalYear);
087            AccountingPeriod acctPeriod = (AccountingPeriod) getBusinessObjectService().findByPrimaryKey(AccountingPeriod.class, keys);
088            return acctPeriod;
089        }
090    
091        /**
092         * This method allows for AccountingPeriod retrieval via String date.
093         * 
094         * @param String
095         */
096        public AccountingPeriod getByStringDate(String dateString) {
097            AccountingPeriod acctPeriod;
098            try {
099                acctPeriod = getByDate(dateTimeService.convertToSqlDate(dateString));
100            }
101            catch (Exception pe) {
102                LOG.error("AccountingPeriod getByStringDate unable to convert string " + dateString + " into date.", pe);
103                throw new RuntimeException("AccountingPeriod getByStringDate unable to convert string " + dateString + " into date.", pe);
104            }
105            return acctPeriod;
106        }
107    
108        /**
109         * This method is a helper method to get the current period.
110         * 
111         * @see org.kuali.kfs.coa.service.AccountingPeriodService#getByDate(java.sql.Date)
112         */
113        @Cached
114        public AccountingPeriod getByDate(Date date) {
115            Map primaryKeys = new HashMap();
116            primaryKeys.put("universityDate", date);
117            UniversityDate universityDate = (UniversityDate) getBusinessObjectService().findByPrimaryKey(UniversityDate.class, primaryKeys);
118            primaryKeys.clear();
119            primaryKeys.put("universityFiscalYear", universityDate.getUniversityFiscalYear());
120            primaryKeys.put("universityFiscalPeriodCode", universityDate.getUniversityFiscalAccountingPeriod());
121            return (AccountingPeriod) getBusinessObjectService().findByPrimaryKey(AccountingPeriod.class, primaryKeys);
122        }
123    
124        /**
125         * This checks to see if the period code is empty or invalid ("13", "AB", "BB", "CB")
126         * 
127         * @param period
128         * @return
129         */
130        protected boolean isInvalidPeriodCode(AccountingPeriod period) {
131            String periodCode = period.getUniversityFiscalPeriodCode();
132            if (periodCode == null) {
133                throw new IllegalArgumentException("invalid (null) universityFiscalPeriodCode (" + periodCode + ")for" + period);
134            }
135            return _invalidPeriodCodes.contains(periodCode);
136        }
137    
138        /**
139         * @see org.kuali.kfs.coa.service.AccountingPeriodService#compareAccountingPeriodsByDate(org.kuali.kfs.coa.businessobject.AccountingPeriod,
140         *      org.kuali.kfs.coa.businessobject.AccountingPeriod)
141         */
142        public int compareAccountingPeriodsByDate(AccountingPeriod tweedleDee, AccountingPeriod tweedleDum) {
143            // note the lack of defensive programming here. If you send a null accounting
144            // period...then chances are, you deserve the NPE that you receive
145            Date tweedleDeeClose = tweedleDee.getUniversityFiscalPeriodEndDate();
146            Date tweedleDumClose = tweedleDum.getUniversityFiscalPeriodEndDate();
147    
148            return tweedleDeeClose.compareTo(tweedleDumClose);
149        }
150    
151        /**
152         * This method retrieves an instance of the businessObjectService.
153         * 
154         * @return
155         */
156        public BusinessObjectService getBusinessObjectService() {
157            return businessObjectService;
158        }
159    
160        /**
161         * This method sets the instance of the businessObjectService.
162         * 
163         * @param businessObjectService
164         */
165        public void setBusinessObjectService(BusinessObjectService businessObjectService) {
166            this.businessObjectService = businessObjectService;
167        }
168    
169        /**
170         * Gets the dateTimeService attribute.
171         * 
172         * @return Returns the dateTimeService.
173         */
174        public DateTimeService getDateTimeService() {
175            return dateTimeService;
176        }
177    
178        /**
179         * Sets the dateTimeService attribute value.
180         * 
181         * @param dateTimeService The dateTimeService to set.
182         */
183        public void setDateTimeService(DateTimeService dateTimeService) {
184            this.dateTimeService = dateTimeService;
185        }
186    
187    
188    }