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.gl.businessobject;
018
019 import java.sql.Date;
020 import java.text.NumberFormat;
021 import java.text.ParseException;
022 import java.text.SimpleDateFormat;
023 import java.util.LinkedHashMap;
024
025 import org.kuali.kfs.coa.businessobject.Account;
026 import org.kuali.kfs.coa.businessobject.Chart;
027 import org.kuali.kfs.coa.businessobject.ObjectCode;
028 import org.kuali.kfs.gl.GeneralLedgerConstants;
029 import org.kuali.kfs.sys.KFSPropertyConstants;
030 import org.kuali.rice.kns.bo.PersistableBusinessObjectBase;
031 import org.kuali.rice.kns.util.KualiDecimal;
032
033 /**
034 * This class represents sufficient fund balances
035 */
036 public class SufficientFundBalances extends PersistableBusinessObjectBase {
037
038 private Integer universityFiscalYear;
039 private String chartOfAccountsCode;
040 private String accountNumber;
041 private String financialObjectCode;
042 private String accountSufficientFundsCode;
043 private KualiDecimal currentBudgetBalanceAmount;
044 private KualiDecimal accountActualExpenditureAmt;
045 private KualiDecimal accountEncumbranceAmount;
046 private Date transactionDateTimeStamp;
047 private ObjectCode objectCode;
048 private Chart chart;
049 private Account account;
050
051 public static final String BLANKS = " ";
052 public static final String DATE_FORMAT_STRING = "yyyy-MM-dd";
053
054 /**
055 * Default constructor.
056 */
057 public SufficientFundBalances() {
058
059 }
060
061 /**
062 * Constructs a SufficientFundBalances.java.
063 * @param line
064 */
065 public SufficientFundBalances(String line) {
066 setFromTextFile(line);
067 }
068
069 /**
070 * This method sets this object's attributes from the passed in line
071 *
072 * @param line with sufficient fund balance related attributes
073 */
074 public void setFromTextFile(String line) {
075
076 // Just in case
077 line = line + " ";
078
079 if (!GeneralLedgerConstants.getSpaceUniversityFiscalYear().equals(line.substring(0, 4))) {
080 setUniversityFiscalYear(new Integer(line.substring(0, 4)));
081 }
082 else {
083 setUniversityFiscalYear(null);
084 }
085 setChartOfAccountsCode(line.substring(4, 6).trim());
086 setAccountNumber(line.substring(6, 13).trim());
087 setFinancialObjectCode(line.substring(13, 17).trim());
088 setAccountSufficientFundsCode(line.substring(17, 24).trim());
089 setCurrentBudgetBalanceAmount(new KualiDecimal(line.substring(24, 41).trim()));
090 setAccountActualExpenditureAmt(new KualiDecimal(line.substring(41, 58).trim()));
091 setAccountEncumbranceAmount(new KualiDecimal(line.substring(58, 75).trim()));
092 setTransactionDateTimeStamp(parseDate(line.substring(75, 85), true));
093 }
094
095 /**
096 * This method returns a string representing this sufficient fund balance object and its attributes
097 *
098 * @return String representing this sufficient fund balance object and its attributes
099 */
100 public String getLine() {
101 NumberFormat nf = NumberFormat.getInstance();
102 nf.setMaximumFractionDigits(2);
103 nf.setMinimumFractionDigits(0);
104 nf.setMinimumIntegerDigits(1);
105 nf.setGroupingUsed(false);
106
107 StringBuffer sb = new StringBuffer();
108 if (universityFiscalYear == null) {
109 sb.append(GeneralLedgerConstants.getSpaceUniversityFiscalYear());
110 }
111 else {
112 sb.append(universityFiscalYear);
113 }
114 sb.append(getField(2, chartOfAccountsCode));
115 sb.append(getField(7, accountNumber));
116 sb.append(getField(4, financialObjectCode));
117 sb.append(getField(1, accountSufficientFundsCode));
118 if (currentBudgetBalanceAmount == null) {
119 sb.append(BLANKS);
120 }
121 else {
122 String a = nf.format(currentBudgetBalanceAmount.doubleValue());
123 sb.append(BLANKS.substring(0, 17 - a.length()));
124 sb.append(a);
125 }
126 if (accountActualExpenditureAmt == null) {
127 sb.append(BLANKS);
128 }
129 else {
130 String a = nf.format(accountActualExpenditureAmt.doubleValue());
131 sb.append(BLANKS.substring(0, 17 - a.length()));
132 sb.append(a);
133 }
134 if (accountEncumbranceAmount == null) {
135 sb.append(BLANKS);
136 }
137 else {
138 String a = nf.format(accountEncumbranceAmount.doubleValue());
139 sb.append(BLANKS.substring(0, 17 - a.length()));
140 sb.append(a);
141 }
142 return sb.toString();
143 }
144
145 private static String SPACES = " ";
146
147 /**
148 * Returns value passed in with additional spaces if need be
149 *
150 * @param size
151 * @param value
152 * @return
153 */
154 private String getField(int size, String value) {
155 if (value == null) {
156 return SPACES.substring(0, size);
157 }
158 else {
159 if (value.length() < size) {
160 return value + SPACES.substring(0, size - value.length());
161 }
162 else {
163 return value;
164 }
165 }
166 }
167
168 /**
169 * This method parses a date as yyyy-MM-dd
170 *
171 * @param sdate
172 * @param beLenientWithDates
173 * @return
174 */
175 private java.sql.Date parseDate(String sdate, boolean beLenientWithDates) {
176 if ((sdate == null) || (sdate.trim().length() == 0)) {
177 return null;
178 }
179 else {
180 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_STRING);
181 sdf.setLenient(beLenientWithDates);
182
183 try {
184 java.util.Date d = sdf.parse(sdate);
185 return new Date(d.getTime());
186 }
187 catch (ParseException e) {
188 return null;
189 }
190 }
191 }
192
193 /**
194 * This method returns a string representation of date as yyyy-MM-dd
195 *
196 * @param date
197 * @return
198 */
199 private String formatDate(Date date) {
200 if (date == null) {
201 return " ";
202 }
203 else {
204 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_STRING);
205 return sdf.format(date);
206 }
207 }
208
209 /**
210 * Gets the universityFiscalYear attribute.
211 *
212 * @return Returns the universityFiscalYear
213 */
214 public Integer getUniversityFiscalYear() {
215 return universityFiscalYear;
216 }
217
218 /**
219 * Sets the universityFiscalYear attribute.
220 *
221 * @param universityFiscalYear The universityFiscalYear to set.
222 */
223 public void setUniversityFiscalYear(Integer universityFiscalYear) {
224 this.universityFiscalYear = universityFiscalYear;
225 }
226
227
228 /**
229 * Gets the chartOfAccountsCode attribute.
230 *
231 * @return Returns the chartOfAccountsCode
232 */
233 public String getChartOfAccountsCode() {
234 return chartOfAccountsCode;
235 }
236
237 /**
238 * Sets the chartOfAccountsCode attribute.
239 *
240 * @param chartOfAccountsCode The chartOfAccountsCode to set.
241 */
242 public void setChartOfAccountsCode(String chartOfAccountsCode) {
243 this.chartOfAccountsCode = chartOfAccountsCode;
244 }
245
246
247 /**
248 * Gets the accountNumber attribute.
249 *
250 * @return Returns the accountNumber
251 */
252 public String getAccountNumber() {
253 return accountNumber;
254 }
255
256 /**
257 * Sets the accountNumber attribute.
258 *
259 * @param accountNumber The accountNumber to set.
260 */
261 public void setAccountNumber(String accountNumber) {
262 this.accountNumber = accountNumber;
263 }
264
265
266 /**
267 * Gets the financialObjectCode attribute.
268 *
269 * @return Returns the financialObjectCode
270 */
271 public String getFinancialObjectCode() {
272 return financialObjectCode;
273 }
274
275 /**
276 * Sets the financialObjectCode attribute.
277 *
278 * @param financialObjectCode The financialObjectCode to set.
279 */
280 public void setFinancialObjectCode(String financialObjectCode) {
281 this.financialObjectCode = financialObjectCode;
282 }
283
284
285 /**
286 * Gets the accountSufficientFundsCode attribute.
287 *
288 * @return Returns the accountSufficientFundsCode
289 */
290 public String getAccountSufficientFundsCode() {
291 return accountSufficientFundsCode;
292 }
293
294 /**
295 * Sets the accountSufficientFundsCode attribute.
296 *
297 * @param accountSufficientFundsCode The accountSufficientFundsCode to set.
298 */
299 public void setAccountSufficientFundsCode(String accountSufficientFundsCode) {
300 this.accountSufficientFundsCode = accountSufficientFundsCode;
301 }
302
303
304 /**
305 * Gets the currentBudgetBalanceAmount attribute.
306 *
307 * @return Returns the currentBudgetBalanceAmount
308 */
309 public KualiDecimal getCurrentBudgetBalanceAmount() {
310 return currentBudgetBalanceAmount;
311 }
312
313 /**
314 * Sets the currentBudgetBalanceAmount attribute.
315 *
316 * @param currentBudgetBalanceAmount The currentBudgetBalanceAmount to set.
317 */
318 public void setCurrentBudgetBalanceAmount(KualiDecimal currentBudgetBalanceAmount) {
319 this.currentBudgetBalanceAmount = currentBudgetBalanceAmount;
320 }
321
322
323 /**
324 * Gets the accountActualExpenditureAmt attribute.
325 *
326 * @return Returns the accountActualExpenditureAmt
327 */
328 public KualiDecimal getAccountActualExpenditureAmt() {
329 return accountActualExpenditureAmt;
330 }
331
332 /**
333 * Sets the accountActualExpenditureAmt attribute.
334 *
335 * @param accountActualExpenditureAmt The accountActualExpenditureAmt to set.
336 */
337 public void setAccountActualExpenditureAmt(KualiDecimal accountActualExpenditureAmt) {
338 this.accountActualExpenditureAmt = accountActualExpenditureAmt;
339 }
340
341
342 /**
343 * Gets the accountEncumbranceAmount attribute.
344 *
345 * @return Returns the accountEncumbranceAmount
346 */
347 public KualiDecimal getAccountEncumbranceAmount() {
348 return accountEncumbranceAmount;
349 }
350
351 /**
352 * Sets the accountEncumbranceAmount attribute.
353 *
354 * @param accountEncumbranceAmount The accountEncumbranceAmount to set.
355 */
356 public void setAccountEncumbranceAmount(KualiDecimal accountEncumbranceAmount) {
357 this.accountEncumbranceAmount = accountEncumbranceAmount;
358 }
359
360
361 /**
362 * Gets the transactionDateTimeStamp attribute.
363 *
364 * @return Returns the transactionDateTimeStamp
365 */
366 public Date getTransactionDateTimeStamp() {
367 return transactionDateTimeStamp;
368 }
369
370 /**
371 * Sets the transactionDateTimeStamp attribute.
372 *
373 * @param transactionDateTimeStamp The transactionDateTimeStamp to set.
374 */
375 public void setTransactionDateTimeStamp(Date transactionDateTimeStamp) {
376 this.transactionDateTimeStamp = transactionDateTimeStamp;
377 }
378
379
380 /**
381 * Gets the objectCode attribute.
382 *
383 * @return Returns the objectCode
384 */
385 public ObjectCode getObjectCode() {
386 return objectCode;
387 }
388
389 /**
390 * Sets the objectCode attribute.
391 *
392 * @param objectCode The objectCode to set.
393 * @deprecated
394 */
395 public void setObjectCode(ObjectCode objectCode) {
396 this.objectCode = objectCode;
397 }
398
399 /**
400 * Gets the chart attribute.
401 *
402 * @return Returns the chart
403 */
404 public Chart getChart() {
405 return chart;
406 }
407
408 /**
409 * Sets the chart attribute.
410 *
411 * @param chart The chart to set.
412 * @deprecated
413 */
414 public void setChart(Chart chart) {
415 this.chart = chart;
416 }
417
418 /**
419 * Gets the account attribute.
420 *
421 * @return Returns the account
422 */
423 public Account getAccount() {
424 return account;
425 }
426
427 /**
428 * Sets the account attribute.
429 *
430 * @param account The account to set.
431 * @deprecated
432 */
433 public void setAccount(Account account) {
434 this.account = account;
435 }
436
437 /**
438 * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper()
439 */
440 protected LinkedHashMap toStringMapper() {
441 LinkedHashMap m = new LinkedHashMap();
442 m.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, this.universityFiscalYear.toString());
443 m.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, this.chartOfAccountsCode);
444 m.put(KFSPropertyConstants.ACCOUNT_NUMBER, this.accountNumber);
445 m.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, this.financialObjectCode);
446 return m;
447 }
448 }