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    }