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.coa.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.sys.KFSPropertyConstants;
026 import org.kuali.kfs.sys.businessobject.SystemOptions;
027 import org.kuali.kfs.sys.context.SpringContext;
028 import org.kuali.rice.kns.bo.DocumentHeader;
029 import org.kuali.rice.kns.bo.GlobalBusinessObject;
030 import org.kuali.rice.kns.bo.GlobalBusinessObjectDetail;
031 import org.kuali.rice.kns.bo.Inactivateable;
032 import org.kuali.rice.kns.bo.PersistableBusinessObject;
033 import org.kuali.rice.kns.bo.PersistableBusinessObjectBase;
034 import org.kuali.rice.kns.service.BusinessObjectService;
035 import org.kuali.rice.kns.util.TypedArrayList;
036
037 /**
038 *
039 */
040 public class SubObjectCodeGlobal extends PersistableBusinessObjectBase implements GlobalBusinessObject, Inactivateable {
041
042 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(SubObjectCodeGlobal.class);
043
044 private String documentNumber;
045 private Integer universityFiscalYear;
046 private String chartOfAccountsCode;
047 private String financialSubObjectCode;
048 private String financialSubObjectCodeName;
049 private String financialSubObjectCodeShortName;
050 private boolean active;
051
052 private DocumentHeader financialDocument;
053 private SystemOptions universityFiscal;
054 private Chart chartOfAccounts;
055
056 private List<SubObjectCodeGlobalDetail> subObjCdGlobalDetails;
057 private List<AccountGlobalDetail> accountGlobalDetails;
058
059 /**
060 * Default constructor.
061 */
062 public SubObjectCodeGlobal() {
063
064
065 subObjCdGlobalDetails = new TypedArrayList(SubObjectCodeGlobalDetail.class);
066 accountGlobalDetails = new TypedArrayList(AccountGlobalDetail.class);
067
068 }
069
070 /**
071 * Gets the documentNumber attribute.
072 *
073 * @return Returns the documentNumber
074 */
075 public String getDocumentNumber() {
076 return documentNumber;
077 }
078
079 /**
080 * Sets the documentNumber attribute.
081 *
082 * @param documentNumber The documentNumber to set.
083 */
084 public void setDocumentNumber(String documentNumber) {
085 this.documentNumber = documentNumber;
086 }
087
088
089 /**
090 * Gets the universityFiscalYear attribute.
091 *
092 * @return Returns the universityFiscalYear
093 */
094 public Integer getUniversityFiscalYear() {
095 return universityFiscalYear;
096 }
097
098 /**
099 * Sets the universityFiscalYear attribute.
100 *
101 * @param universityFiscalYear The universityFiscalYear to set.
102 */
103 public void setUniversityFiscalYear(Integer universityFiscalYear) {
104 this.universityFiscalYear = universityFiscalYear;
105 }
106
107
108 /**
109 * Gets the chartOfAccountsCode attribute.
110 *
111 * @return Returns the chartOfAccountsCode
112 */
113 public String getChartOfAccountsCode() {
114 return chartOfAccountsCode;
115 }
116
117 /**
118 * Sets the chartOfAccountsCode attribute.
119 *
120 * @param chartOfAccountsCode The chartOfAccountsCode to set.
121 */
122 public void setChartOfAccountsCode(String chartOfAccountsCode) {
123 this.chartOfAccountsCode = chartOfAccountsCode;
124 }
125
126
127 /**
128 * Gets the financialSubObjectCode attribute.
129 *
130 * @return Returns the financialSubObjectCode
131 */
132 public String getFinancialSubObjectCode() {
133 return financialSubObjectCode;
134 }
135
136 /**
137 * Sets the financialSubObjectCode attribute.
138 *
139 * @param financialSubObjectCode The financialSubObjectCode to set.
140 */
141 public void setFinancialSubObjectCode(String financialSubObjectCode) {
142 this.financialSubObjectCode = financialSubObjectCode;
143 }
144
145
146 /**
147 * Gets the financialSubObjectCodeName attribute.
148 *
149 * @return Returns the financialSubObjectCodeName
150 */
151 public String getFinancialSubObjectCodeName() {
152 return financialSubObjectCodeName;
153 }
154
155 /**
156 * Sets the financialSubObjectCodeName attribute.
157 *
158 * @param financialSubObjectCodeName The financialSubObjectCodeName to set.
159 */
160 public void setFinancialSubObjectCodeName(String financialSubObjectCodeName) {
161 this.financialSubObjectCodeName = financialSubObjectCodeName;
162 }
163
164
165 /**
166 * Gets the financialSubObjectCodeShortName attribute.
167 *
168 * @return Returns the financialSubObjectCodeShortName
169 */
170 public String getFinancialSubObjectCodeShortName() {
171 return financialSubObjectCodeShortName;
172 }
173
174 /**
175 * Sets the financialSubObjectCodeShortName attribute.
176 *
177 * @param financialSubObjectCodeShortName The financialSubObjectCodeShortName to set.
178 */
179 public void setFinancialSubObjectCodeShortName(String financialSubObjectCdshortNm) {
180 this.financialSubObjectCodeShortName = financialSubObjectCdshortNm;
181 }
182
183
184 /**
185 * Gets the active attribute.
186 *
187 * @return Returns the active
188 */
189 public boolean isActive() {
190 return active;
191 }
192
193
194 /**
195 * Sets the active attribute.
196 *
197 * @param active The active to set.
198 */
199 public void setActive(boolean active) {
200 this.active = active;
201 }
202
203
204 /**
205 * Gets the financialDocument attribute.
206 *
207 * @return Returns the financialDocument
208 */
209 public DocumentHeader getFinancialDocument() {
210 return financialDocument;
211 }
212
213 /**
214 * Sets the financialDocument attribute.
215 *
216 * @param financialDocument The financialDocument to set.
217 * @deprecated
218 */
219 public void setFinancialDocument(DocumentHeader financialDocument) {
220 this.financialDocument = financialDocument;
221 }
222
223 /**
224 * Gets the universityFiscal attribute.
225 *
226 * @return Returns the universityFiscal
227 */
228 public SystemOptions getUniversityFiscal() {
229 return universityFiscal;
230 }
231
232 /**
233 * Sets the universityFiscal attribute.
234 *
235 * @param universityFiscal The universityFiscal to set.
236 * @deprecated
237 */
238 public void setUniversityFiscal(SystemOptions universityFiscal) {
239 this.universityFiscal = universityFiscal;
240 }
241
242 /**
243 * Gets the chartOfAccounts attribute.
244 *
245 * @return Returns the chartOfAccounts
246 */
247 public Chart getChartOfAccounts() {
248 return chartOfAccounts;
249 }
250
251 /**
252 * Sets the chartOfAccounts attribute.
253 *
254 * @param chartOfAccounts The chartOfAccounts to set.
255 * @deprecated
256 */
257 public void setChartOfAccounts(Chart chartOfAccounts) {
258 this.chartOfAccounts = chartOfAccounts;
259 }
260
261 /**
262 * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper()
263 */
264 protected LinkedHashMap toStringMapper() {
265 LinkedHashMap m = new LinkedHashMap();
266 m.put(KFSPropertyConstants.DOCUMENT_NUMBER, this.documentNumber);
267 return m;
268 }
269
270 public List<SubObjectCodeGlobalDetail> getSubObjCdGlobalDetails() {
271 return subObjCdGlobalDetails;
272 }
273
274 public void setSubObjCdGlobalDetails(List<SubObjectCodeGlobalDetail> subObjCdGlobalDetails) {
275 this.subObjCdGlobalDetails = subObjCdGlobalDetails;
276 }
277
278 public List<AccountGlobalDetail> getAccountGlobalDetails() {
279 return accountGlobalDetails;
280 }
281
282 public void setAccountGlobalDetails(List<AccountGlobalDetail> accountGlobalDetails) {
283 this.accountGlobalDetails = accountGlobalDetails;
284 }
285
286 /**
287 * @see org.kuali.rice.kns.document.GlobalBusinessObject#getGlobalChangesToDelete()
288 */
289 public List<PersistableBusinessObject> generateDeactivationsToPersist() {
290 return null;
291 }
292
293 /**
294 * This returns a list of Sub Object Codes to Update and/or Add
295 *
296 * @see org.kuali.rice.kns.document.GlobalBusinessObject#applyGlobalChanges()
297 */
298 public List<PersistableBusinessObject> generateGlobalChangesToPersist() {
299 LOG.debug("applyGlobalChanges");
300 List result = new ArrayList();
301
302 // Iterate through Account/Object Code combinations; create new or update as necessary
303
304 for (SubObjectCodeGlobalDetail subObjCdGlobalDetail : subObjCdGlobalDetails) {
305
306 String financialObjectCode = subObjCdGlobalDetail.getFinancialObjectCode();
307
308 if (financialObjectCode != null && financialObjectCode.length() > 0) {
309
310 for (AccountGlobalDetail accountGlobalDetail : accountGlobalDetails) {
311
312 Map pk = new HashMap();
313
314 String accountNumber = accountGlobalDetail.getAccountNumber();
315
316 if (accountNumber != null && accountNumber.length() > 0) {
317 pk.put("UNIV_FISCAL_YR", this.universityFiscalYear);
318 pk.put("FIN_COA_CD", this.chartOfAccountsCode);
319 pk.put("ACCOUNT_NBR", accountNumber);
320 pk.put("FIN_OBJECT_CD", financialObjectCode);
321 pk.put("FIN_SUB_OBJ_CD", this.financialSubObjectCode);
322
323 SubObjectCode subObjCd = (SubObjectCode) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(SubObjectCode.class, pk);
324 if (subObjCd == null) {
325 subObjCd = new SubObjectCode(this.universityFiscalYear, this.chartOfAccountsCode, accountNumber, financialObjectCode, this.financialSubObjectCode);
326 }
327 populate(subObjCd, accountGlobalDetail, subObjCdGlobalDetail);
328 result.add(subObjCd);
329 }
330 }
331 }
332 }
333
334 return result;
335 }
336
337 public void populate(SubObjectCode old, AccountGlobalDetail accountGlobalDetail, SubObjectCodeGlobalDetail subObjCdGlobalDetail) {
338 old.setFinancialSubObjectCodeName(update(old.getFinancialSubObjectCodeName(), financialSubObjectCodeName));
339 old.setFinancialSubObjectCdshortNm(update(old.getFinancialSubObjectCdshortNm(), financialSubObjectCodeShortName));
340 old.setActive(update(old.isActive(), active));
341 }
342
343
344 /**
345 * This method returns newvalue iff it is not empty
346 *
347 * @param oldValue
348 * @param newValue
349 * @return
350 */
351 private String update(String oldValue, String newValue) {
352 if (newValue == null || newValue.length() == 0) {
353 return oldValue;
354 }
355 return newValue;
356 }
357
358 private boolean update(boolean oldValue, boolean newValue) {
359 return newValue;
360 }
361
362
363 public boolean isPersistable() {
364 return true;
365 }
366
367 public List<? extends GlobalBusinessObjectDetail> getAllDetailObjects() {
368 ArrayList<GlobalBusinessObjectDetail> details = new ArrayList<GlobalBusinessObjectDetail>(accountGlobalDetails.size() + subObjCdGlobalDetails.size());
369 details.addAll(accountGlobalDetails);
370 details.addAll(subObjCdGlobalDetails);
371 return details;
372 }
373
374 /**
375 * @see org.kuali.rice.kns.bo.PersistableBusinessObjectBase#buildListOfDeletionAwareLists()
376 */
377 @Override
378 public List buildListOfDeletionAwareLists() {
379 List<List> managedLists = super.buildListOfDeletionAwareLists();
380
381 managedLists.add(getAccountGlobalDetails());
382 managedLists.add(getSubObjCdGlobalDetails());
383
384 return managedLists;
385 }
386 }