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.service.impl;
017    
018    import java.math.BigDecimal;
019    import java.text.ParseException;
020    import java.text.SimpleDateFormat;
021    import java.util.Calendar;
022    import java.util.Date;
023    import java.util.GregorianCalendar;
024    import java.util.HashMap;
025    import java.util.Map;
026    
027    import org.apache.log4j.Logger;
028    import org.kuali.kfs.module.endow.EndowConstants;
029    import org.kuali.kfs.module.endow.EndowParameterKeyConstants;
030    import org.kuali.kfs.module.endow.batch.AvailableCashUpdateStep;
031    import org.kuali.kfs.module.endow.businessobject.CurrentTaxLotBalance;
032    import org.kuali.kfs.module.endow.businessobject.PooledFundValue;
033    import org.kuali.kfs.module.endow.document.service.CurrentTaxLotService;
034    import org.kuali.kfs.module.endow.document.service.KEMService;
035    import org.kuali.kfs.pdp.businessobject.Batch;
036    import org.kuali.kfs.sys.KFSConstants;
037    import org.kuali.kfs.sys.context.SpringContext;
038    import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
039    import org.kuali.rice.kns.service.DateTimeService;
040    import org.kuali.rice.kns.service.ParameterService;
041    import org.kuali.rice.kns.util.KualiInteger;
042    import org.kuali.rice.kns.util.ObjectUtils;
043    
044    public class KEMServiceImpl implements KEMService {
045    
046        private DateTimeService dateTimeService;
047        private ParameterService parameterService;
048        private CurrentTaxLotService currentTaxLotService;
049    
050        private static Logger log = org.apache.log4j.Logger.getLogger(KEMServiceImpl.class);
051    
052        /**
053         * @see org.kuali.kfs.module.endow.document.service.KEMService#getMarketValue(java.lang.String)
054         */
055        public BigDecimal getMarketValue(String securityId) {
056    
057            BigDecimal marketValue = currentTaxLotService.getHoldingMarketValueSumForSecurity(securityId);
058    
059            return marketValue;
060        }
061    
062        /**
063         * @see org.kuali.kfs.module.endow.document.service.KEMService#getMarketValue(java.lang.String, java.lang.String,
064         *      java.lang.String, org.kuali.rice.kns.util.KualiInteger, java.lang.String)
065         */
066        public BigDecimal getMarketValue(String kemid, String securityId, String registrationCode, KualiInteger lotNumber, String ipIndicator) {
067            BigDecimal marketValue = BigDecimal.ZERO;
068    
069            CurrentTaxLotBalance currentTaxLotBalance = currentTaxLotService.getByPrimaryKey(kemid, securityId, registrationCode, lotNumber, ipIndicator);
070    
071            if (ObjectUtils.isNotNull(currentTaxLotBalance) && currentTaxLotBalance.getHoldingMarketValue() != null) {
072                marketValue = currentTaxLotBalance.getHoldingMarketValue();
073            }
074            return marketValue;
075        }
076    
077        /**
078         * @see org.kuali.kfs.module.endow.document.service.KEMService#mod10(java.lang.String)
079         */
080        public String mod10(String prefix) {
081            Map<String, Integer> mod10 = new HashMap<String, Integer>();
082            char[] userInputChars = prefix.toCharArray();
083            int theNinthDigit = 0;
084    
085            for (int i = 0; i < userInputChars.length; i++) {
086    
087                int mod10MappingForCurrentChar = mapChar(userInputChars[i]);
088    
089                if (i % 2 != 0) {
090    
091                    mod10MappingForCurrentChar *= 2;
092                }
093    
094                if (mod10MappingForCurrentChar > 9) {
095                    mod10MappingForCurrentChar = (mod10MappingForCurrentChar % 10) + (mod10MappingForCurrentChar / 10);
096                }
097    
098                theNinthDigit += mod10MappingForCurrentChar;
099            }
100    
101            theNinthDigit = (10 - (theNinthDigit % 10)) % 10;
102    
103            return String.valueOf(theNinthDigit);
104        }
105    
106        /**
107         * Maps a char to an integer value
108         * 
109         * @param c the character to be mapped
110         * @return the mapped value
111         */
112        private static int mapChar(char c) {
113    
114            if (c >= '0' && c <= '9')
115                return c - '0';
116    
117            if (c == '*')
118                return 36;
119            if (c == '#')
120                return 37;
121            if (c == '@')
122                return 38;
123    
124            return c - 'A' + 10;
125        }
126    
127        /**
128         * @see org.kuali.kfs.module.endow.document.service.KEMService#getCurrentSystemProcessDate()
129         */
130        public String getCurrentSystemProcessDate() {
131    
132            ParameterService parameterService = SpringContext.getBean(ParameterService.class);
133    
134            String curentSystemProcessDate = parameterService.getParameterValue(KfsParameterConstants.ENDOWMENT_ALL.class, EndowParameterKeyConstants.CURRENT_PROCESS_DATE);
135    
136            return curentSystemProcessDate;
137        }
138    
139        /**
140         * @see org.kuali.kfs.module.endow.document.service.KEMService#getCurrentSystemProcessDate()
141         */
142        public String getCurrentSystemProcessDateFormated() throws Exception {
143            return getDateTimeService().toDateString(getCurrentDate());
144        }
145    
146        public Date getCurrentSystemProcessDateObject() {
147            Date date = null;
148    
149            try {
150                String systemDateString = getCurrentSystemProcessDate();
151                SimpleDateFormat sdfSource = new SimpleDateFormat("dd-MMM-yy");
152                date = sdfSource.parse(systemDateString);
153    
154            }
155            catch (Exception e) {
156                log.debug("Issue obtaining System Date", e);
157                date = new Date();
158            }
159    
160            return date;
161        }
162    
163        /**
164         * @see org.kuali.kfs.module.endow.document.service.KEMService#getCurrentDate()
165         */
166        public java.sql.Date getCurrentDate() {
167            java.sql.Date currentDate = null;
168            String useProcessDate = parameterService.getParameterValue(KfsParameterConstants.ENDOWMENT_ALL.class, EndowParameterKeyConstants.USE_PROCESS_DATE);
169    
170            if (KFSConstants.ParameterValues.YES.equalsIgnoreCase(useProcessDate)) {
171                currentDate = getCurrentProcessDate();
172            }
173            else {
174                currentDate = dateTimeService.getCurrentSqlDate();
175            }
176            return currentDate;
177        }
178    
179        /**
180         * @see org.kuali.kfs.module.endow.document.service.KEMService#getCurrentProcessDate()
181         */
182        public java.sql.Date getCurrentProcessDate() {
183            java.sql.Date date = null;
184    
185            String currentProcessDate = getCurrentSystemProcessDate();
186            try {
187                date = dateTimeService.convertToSqlDate(currentProcessDate);
188            }
189            catch (ParseException ex) {
190                throw new RuntimeException("Invalid value for " + EndowParameterKeyConstants.CURRENT_PROCESS_DATE + " system parameter: " + currentProcessDate + ".\n" + ex.getMessage());
191            }
192    
193            return date;
194        }
195    
196        /**
197         * @see org.kuali.kfs.module.endow.document.service.KEMService#getAvailableCashPercent() Gets the AVAILABLE_CASH_PERCENT system
198         *      parameter
199         * @return AVAILABLE_CASH_PERCENT value
200         */
201        public BigDecimal getAvailableCashPercent() {
202            BigDecimal availableCashPercent = BigDecimal.ZERO;
203    
204            ParameterService parameterService = SpringContext.getBean(ParameterService.class);
205            String systemParameterAvailablePercent = parameterService.getParameterValue(AvailableCashUpdateStep.class, EndowParameterKeyConstants.AvailableCashUpdateConstants.AVAILABLE_CASH_PERCENT);
206            availableCashPercent = new BigDecimal(systemParameterAvailablePercent);
207    
208            return availableCashPercent;
209        }
210    
211        /**
212         * @see org.kuali.kfs.module.endow.document.service.KEMService#getFiscalYearEndDayAndMonth() Gets the
213         *      FISCAL_YEAR_END_DAY_AND_MONTH system parameter
214         * @return FISCAL_YEAR_END_DAY_AND_MONTH value
215         */
216        public java.sql.Date getFiscalYearEndDayAndMonth() {
217            java.sql.Date fiscalDate = null;
218    
219            ParameterService parameterService = SpringContext.getBean(ParameterService.class);
220            String yearEndDateAndMonth = parameterService.getParameterValue(KfsParameterConstants.ENDOWMENT_BATCH.class, EndowParameterKeyConstants.FISCAL_YEAR_END_DAY_AND_MONTH);
221    
222            Calendar calendar = Calendar.getInstance();
223            
224            yearEndDateAndMonth =  yearEndDateAndMonth.substring(0, 2).concat("/").concat(yearEndDateAndMonth.substring(2, 4)).concat("/") + calendar.get(Calendar.YEAR);
225    
226            try {
227                fiscalDate = getDateTimeService().convertToSqlDate(yearEndDateAndMonth);
228            }
229            catch (ParseException pe) {
230                return null;
231            }
232    
233            return fiscalDate;
234        }
235    
236        /**
237         * @see org.kuali.kfs.module.endow.document.service.org.kuali.kfs.module.endow.document.service.KEMService#getTotalNumberOfPaymentsForFiscalYear()
238         */
239        public long getTotalNumberOfPaymentsForFiscalYear() {
240            long totalNumberOfPayments = 2;
241    
242            ParameterService parameterService = SpringContext.getBean(ParameterService.class);
243            String totalPayments = parameterService.getParameterValue(PooledFundValue.class, EndowParameterKeyConstants.DISTRIBUTION_TIMES_PER_YEAR);
244            
245            try {
246                totalNumberOfPayments = Long.parseLong(totalPayments);
247            } catch (NumberFormatException nfe) {
248                log.info("Unable to convert the value of DISTRIBUTION_TIMES_PER_YEAR system parameter.");
249            }
250            
251            return totalNumberOfPayments;
252        }
253    
254        /**
255         * @see org.kuali.kfs.module.endow.document.service.KEMService#getNumberOfDaysInCalendarYear()
256         */
257        public int getNumberOfDaysInCalendarYear() {
258            Date currentDate = getCurrentDate();
259            Calendar calendar = Calendar.getInstance();
260    
261            GregorianCalendar gregorianCalendar = new GregorianCalendar();
262            calendar.setTime(currentDate);
263            gregorianCalendar.setTime(currentDate);
264    
265            if (gregorianCalendar.isLeapYear(calendar.YEAR)) {
266                return 366;
267            }
268            else
269                return 365;
270        }
271    
272        /**
273         * Gets the first day after the fiscal year end day and month as set in the system parameter.
274         * @see org.kuali.kfs.module.endow.document.service.KEMService#getFirstDayAfterFiscalYearEndDayAndMonth()
275         * @return Date
276         */
277        public java.sql.Date getFirstDayAfterFiscalYearEndDayAndMonth() {
278            Date fiscalYearEndDate = getFiscalYearEndDayAndMonth();
279            
280            Calendar calendar = Calendar.getInstance();
281            calendar.setTime(fiscalYearEndDate);
282            calendar.add(Calendar.DAY_OF_MONTH, 1);
283            calendar.set(Calendar.HOUR, 0);
284            calendar.set(Calendar.MINUTE, 0);
285            calendar.set(Calendar.SECOND, 0);
286            calendar.set(Calendar.MILLISECOND, 0);        
287            return new java.sql.Date(calendar.getTimeInMillis());
288        }
289        
290        /**
291         * @see org.kuali.kfs.module.endow.document.service.KEMService#getMaxNumberOfTransactionLinesPerDocument()
292         * @return maximumNumberOfTransactionLines
293         */
294        public int getMaxNumberOfTransactionLinesPerDocument() {
295            int maximumNumberOfTransactionLines = EndowConstants.MAXIMUM_NUMBER_OF_LINES_PER_EDOC;
296            
297            try { 
298                maximumNumberOfTransactionLines = Integer.parseInt(parameterService.getParameterValue(KfsParameterConstants.ENDOWMENT_BATCH.class, EndowParameterKeyConstants.MAXIMUM_TRANSACTION_LINES));
299            }
300            catch (NumberFormatException ex) {
301                return maximumNumberOfTransactionLines;
302            }
303            
304            return maximumNumberOfTransactionLines;
305        }
306        
307        /**
308         * Gets the dateTimeService.
309         * 
310         * @return dateTimeService
311         */
312        public DateTimeService getDateTimeService() {
313            return dateTimeService;
314        }
315    
316        /**
317         * Sets dateTimeService.
318         * 
319         * @param dateTimeService
320         */
321        public void setDateTimeService(DateTimeService dateTimeService) {
322            this.dateTimeService = dateTimeService;
323        }
324    
325        /**
326         * Gets the parameterService.
327         * 
328         * @return parameterService
329         */
330        public ParameterService getParameterService() {
331            return parameterService;
332        }
333    
334        /**
335         * Sets the parameterService.
336         * 
337         * @param parameterService
338         */
339        public void setParameterService(ParameterService parameterService) {
340            this.parameterService = parameterService;
341        }
342    
343        /**
344         * Gets the currentTaxLotService.
345         * 
346         * @param currentTaxLotService
347         */
348        public void setCurrentTaxLotService(CurrentTaxLotService currentTaxLotService) {
349            this.currentTaxLotService = currentTaxLotService;
350        }
351    
352    }