001 /**
002 * Copyright 2004-2012 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.businessobject;
017
018 import java.sql.Date;
019 import java.util.Calendar;
020 import java.util.LinkedHashMap;
021 import java.util.List;
022
023 import org.apache.commons.lang.StringUtils;
024 import org.apache.commons.lang.time.DateUtils;
025 import org.kuali.rice.core.api.mo.common.active.Inactivatable;
026 import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
027
028 /**
029 *
030 */
031 public class Account extends PersistableBusinessObjectBase implements Inactivatable {
032 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(Account.class);
033
034 private String chartOfAccountsCode;
035 private String accountNumber;
036 private String accountName;
037 private Date accountCreateDate;
038 private Date accountEffectiveDate;
039 private Date accountExpirationDate;
040 private boolean active;
041 private String organizationCode;
042 //private boolean closed;
043
044 public String getOrganizationCode() {
045 return organizationCode;
046 }
047
048 public void setOrganizationCode(String organizationCode) {
049 this.organizationCode = organizationCode;
050 }
051
052
053 private Chart chartOfAccounts;
054 private Organization organization;
055
056 private List subAccounts;
057
058 /**
059 * Default no-arg constructor.
060 */
061 public Account() {
062 active = true; // assume active is true until set otherwise
063 }
064
065
066 /**
067 * Gets the accountNumber attribute.
068 *
069 * @return Returns the accountNumber
070 */
071 public String getAccountNumber() {
072 return accountNumber;
073 }
074
075 /**
076 * Sets the accountNumber attribute.
077 *
078 * @param accountNumber The accountNumber to set.
079 */
080 public void setAccountNumber(String accountNumber) {
081 this.accountNumber = accountNumber;
082 }
083
084 /**
085 * Gets the accountName attribute.
086 *
087 * @return Returns the accountName
088 */
089 public String getAccountName() {
090 return accountName;
091 }
092
093 /**
094 * Sets the accountName attribute.
095 *
096 * @param accountName The accountName to set.
097 */
098 public void setAccountName(String accountName) {
099 this.accountName = accountName;
100 }
101
102 /**
103 * Gets the accountCreateDate attribute.
104 *
105 * @return Returns the accountCreateDate
106 */
107 public Date getAccountCreateDate() {
108 return accountCreateDate;
109 }
110
111 /**
112 * Sets the accountCreateDate attribute.
113 *
114 * @param accountCreateDate The accountCreateDate to set.
115 */
116 public void setAccountCreateDate(Date accountCreateDate) {
117 this.accountCreateDate = accountCreateDate;
118 }
119
120 /**
121 * Gets the accountEffectiveDate attribute.
122 *
123 * @return Returns the accountEffectiveDate
124 */
125 public Date getAccountEffectiveDate() {
126 return accountEffectiveDate;
127 }
128
129 /**
130 * Sets the accountEffectiveDate attribute.
131 *
132 * @param accountEffectiveDate The accountEffectiveDate to set.
133 */
134 public void setAccountEffectiveDate(Date accountEffectiveDate) {
135 this.accountEffectiveDate = accountEffectiveDate;
136 }
137
138 /**
139 * Gets the accountExpirationDate attribute.
140 *
141 * @return Returns the accountExpirationDate
142 */
143 public Date getAccountExpirationDate() {
144 return accountExpirationDate;
145 }
146
147 /**
148 * Sets the accountExpirationDate attribute.
149 *
150 * @param accountExpirationDate The accountExpirationDate to set.
151 */
152 public void setAccountExpirationDate(Date accountExpirationDate) {
153 this.accountExpirationDate = accountExpirationDate;
154 }
155
156 /**
157 * This method determines whether the account is expired or not. Note that if Expiration Date is the same date as testDate, then
158 * this will return false. It will only return true if the account expiration date is one day earlier than testDate or earlier.
159 * Note that this logic ignores all time components when doing the comparison. It only does the before/after comparison based on
160 * date values, not time-values.
161 *
162 * @param testDate - Calendar instance with the date to test the Account's Expiration Date against. This is most commonly set to
163 * today's date.
164 * @return true or false based on the logic outlined above
165 */
166 public boolean isExpired(Calendar testDate) {
167 if (LOG.isDebugEnabled()) {
168 LOG.debug("entering isExpired(" + testDate + ")");
169 }
170
171 // dont even bother trying to test if the accountExpirationDate is null
172 if (this.accountExpirationDate == null) {
173 return false;
174 }
175
176 // remove any time-components from the testDate
177 testDate = DateUtils.truncate(testDate, Calendar.DAY_OF_MONTH);
178
179 // get a calendar reference to the Account Expiration
180 // date, and remove any time components
181 Calendar acctDate = Calendar.getInstance();
182 acctDate.setTime(this.accountExpirationDate);
183 acctDate = DateUtils.truncate(acctDate, Calendar.DAY_OF_MONTH);
184
185 // if the Account Expiration Date is before the testDate
186 if (acctDate.before(testDate)) {
187 return true;
188 }
189 else {
190 return false;
191 }
192 }
193
194 /**
195 * This method determines whether the account is expired or not. Note that if Expiration Date is the same date as testDate, then
196 * this will return false. It will only return true if the account expiration date is one day earlier than testDate or earlier.
197 * Note that this logic ignores all time components when doing the comparison. It only does the before/after comparison based on
198 * date values, not time-values.
199 *
200 * @param testDate - java.util.Date instance with the date to test the Account's Expiration Date against. This is most commonly
201 * set to today's date.
202 * @return true or false based on the logic outlined above
203 */
204 public boolean isExpired(Date testDate) {
205
206 // dont even bother trying to test if the accountExpirationDate is null
207 if (this.accountExpirationDate == null) {
208 return false;
209 }
210
211 Calendar acctDate = Calendar.getInstance();
212 acctDate.setTime(testDate);
213 return isExpired(acctDate);
214 }
215
216 /**
217 * Gets the active attribute.
218 *
219 * @return Returns the active
220 */
221 public boolean isActive() {
222 return active;
223 }
224
225 /**
226 * Sets the active attribute.
227 *
228 * @param active The active to set.
229 */
230 public void setActive(boolean active) {
231 this.active = active;
232 }
233
234 /**
235 * Returns whether this account is not active or not
236 *
237 * @return the opposite of isActive()
238 */
239 public boolean isClosed() {
240 return !active;
241 }
242
243 /**
244 * Sets the closed attribute.
245 *
246 * @param closed The closed to set.
247 */
248 public void setClosed(boolean closed) {
249 this.active = !closed;
250 }
251
252 /**
253 * Gets the chartOfAccounts attribute.
254 *
255 * @return Returns the chartOfAccounts
256 */
257 public Chart getChartOfAccounts() {
258 return chartOfAccounts;
259 }
260
261 /**
262 * Sets the chartOfAccounts attribute.
263 *
264 * @param chartOfAccounts The chartOfAccounts to set.
265 * @deprecated
266 */
267 public void setChartOfAccounts(Chart chartOfAccounts) {
268 this.chartOfAccounts = chartOfAccounts;
269 }
270
271 /**
272 * Gets the organization attribute.
273 *
274 * @return Returns the organization
275 */
276 public Organization getOrganization() {
277 return organization;
278 }
279
280 /**
281 * Sets the organization attribute.
282 *
283 * @param organization The organization to set.
284 * @deprecated
285 */
286 public void setOrganization(Organization organization) {
287 this.organization = organization;
288 }
289
290 /**
291 * @return Returns the subAccounts.
292 */
293 public List getSubAccounts() {
294 return subAccounts;
295 }
296
297
298 /**
299 * @param subAccounts The subAccounts to set.
300 */
301 public void setSubAccounts(List subAccounts) {
302 this.subAccounts = subAccounts;
303 }
304
305
306 /**
307 * @return Returns the chartOfAccountsCode.
308 */
309 public String getChartOfAccountsCode() {
310 return chartOfAccountsCode;
311 }
312
313
314 /**
315 * @param chartOfAccountsCode The chartOfAccountsCode to set.
316 */
317 public void setChartOfAccountsCode(String chartOfAccountsCode) {
318 this.chartOfAccountsCode = chartOfAccountsCode;
319 }
320
321 /**
322 * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper()
323 */
324 protected LinkedHashMap toStringMapper() {
325 LinkedHashMap m = new LinkedHashMap();
326
327 m.put("chartCode", this.chartOfAccountsCode);
328 m.put("accountNumber", this.accountNumber);
329
330 return m;
331 }
332
333
334 /**
335 * Implementing equals since I need contains to behave reasonably in a hashed datastructure.
336 *
337 * @see java.lang.Object#equals(java.lang.Object)
338 */
339 public boolean equals(Object obj) {
340 boolean equal = false;
341
342 if (obj != null) {
343 if (this.getClass().equals(obj.getClass())) {
344 Account other = (Account) obj;
345
346 if (StringUtils.equals(this.getChartOfAccountsCode(), other.getChartOfAccountsCode())) {
347 if (StringUtils.equals(this.getAccountNumber(), other.getAccountNumber())) {
348 equal = true;
349 }
350 }
351 }
352 }
353
354 return equal;
355 }
356
357 /**
358 * Calcluates hashCode based on current values of chartOfAccountsCode and accountNumber fields. Somewhat dangerous, since both
359 * of those fields are mutable, but I don't expect people to be editing those values directly for Accounts stored in hashed
360 * datastructures.
361 *
362 * @see java.lang.Object#hashCode()
363 */
364 public int hashCode() {
365 String hashString = getChartOfAccountsCode() + "|" + getAccountNumber();
366
367 return hashString.hashCode();
368 }
369
370
371 /**
372 * Convenience method to make the primitive account fields from this Account easier to compare to the account fields from
373 * another Account or an AccountingLine
374 *
375 * @return String representing the account associated with this Accounting
376 */
377 public String getAccountKey() {
378 String key = getChartOfAccountsCode() + ":" + getAccountNumber();
379 return key;
380 }
381 }
382