1 /*
2 * Copyright 2005-2006 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.ole.fp.document.web.struts;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.Map;
21
22 import javax.servlet.http.HttpServletRequest;
23
24 import org.apache.commons.lang.StringUtils;
25 import org.kuali.ole.coa.businessobject.BalanceType;
26 import org.kuali.ole.coa.service.BalanceTypeService;
27 import org.kuali.ole.fp.document.JournalVoucherDocument;
28 import org.kuali.ole.sys.OLEConstants;
29 import org.kuali.ole.sys.businessobject.SourceAccountingLine;
30 import org.kuali.ole.sys.context.SpringContext;
31 import org.kuali.rice.krad.util.ObjectUtils;
32
33 /**
34 * This class is the Struts specific form object that works in conjunction with the pojo utilities to build the UI for the Journal
35 * Voucher Document. This class is unique in that it leverages a helper data structure called the VoucherAccountingLineHelper
36 * because the Journal Voucher, under certain conditions, presents the user with a debit and credit column for amount entry. In
37 * addition, this form class must keep track of the changes between the old and new balance type selection so that the corresponding
38 * action class and make decisions based upon the differences. New accounting lines use specific credit and debit amount fields b/c
39 * the new line is explicitly known; however, already existing accounting lines need to exist within a list with ordering that
40 * matches the accounting lines source list.
41 */
42 public class JournalVoucherForm extends VoucherForm {
43 protected List balanceTypes;
44 protected String originalBalanceType;
45 protected BalanceType selectedBalanceType;
46
47 /**
48 * Constructs a JournalVoucherForm instance.
49 */
50 public JournalVoucherForm() {
51 super();
52 selectedBalanceType = new BalanceType(OLEConstants.BALANCE_TYPE_ACTUAL);
53 originalBalanceType = "";
54 }
55
56 @Override
57 protected String getDefaultDocumentTypeName() {
58 return "OLE_JV";
59 }
60
61 /**
62 * Overrides the parent to call super.populate and then to call the two methods that are specific to loading the two select
63 * lists on the page. In addition, this also makes sure that the credit and debit amounts are filled in for situations where
64 * validation errors occur and the page reposts.
65 *
66 * @see org.kuali.rice.kns.web.struts.pojo.PojoForm#populate(javax.servlet.http.HttpServletRequest)
67 */
68 @Override
69 public void populate(HttpServletRequest request) {
70 super.populate(request);
71 populateBalanceTypeListForRendering();
72 }
73
74 /**
75 * Override the parent, to push the chosen accounting period and balance type down into the source accounting line object. In
76 * addition, check the balance type to see if it's the "External Encumbrance" balance and alter the encumbrance update code on
77 * the accounting line appropriately.
78 *
79 * @see org.kuali.rice.kns.web.struts.form.KualiTransactionalDocumentFormBase#populateSourceAccountingLine(org.kuali.rice.krad.bo.SourceAccountingLine)
80 */
81 @Override
82 public void populateSourceAccountingLine(SourceAccountingLine sourceLine, String accountingLinePropertyName, Map parameterMap) {
83 super.populateSourceAccountingLine(sourceLine, accountingLinePropertyName, parameterMap);
84 populateSourceAccountingLineEncumbranceCode(sourceLine);
85 }
86
87 /**
88 * Sets the encumbrance code of the line based on the balance type.
89 *
90 * @param sourceLine - line to set code on
91 */
92 protected void populateSourceAccountingLineEncumbranceCode(SourceAccountingLine sourceLine) {
93 BalanceType selectedBalanceType = getSelectedBalanceType();
94 if (ObjectUtils.isNotNull(selectedBalanceType) && StringUtils.isNotBlank(selectedBalanceType.getCode())) {
95 sourceLine.setBalanceTyp(selectedBalanceType);
96 sourceLine.setBalanceTypeCode(selectedBalanceType.getCode());
97
98 // set the encumbrance update code appropriately
99 // KFSMI-5565 remove the default encumbrance code
100 // no more default encumbrance code
101 // if (OLEConstants.BALANCE_TYPE_EXTERNAL_ENCUMBRANCE.equals(selectedBalanceType.getCode())) {
102 // sourceLine.setEncumbranceUpdateCode(OLEConstants.JOURNAL_VOUCHER_ENCUMBRANCE_UPDATE_CODE_BALANCE_TYPE_EXTERNAL_ENCUMBRANCE);
103 // }
104 // else {
105 // sourceLine.setEncumbranceUpdateCode(null);
106 // }
107 }
108 else {
109 // it's the first time in, the form will be empty the first time in
110 // set up default selection value
111 selectedBalanceType = getPopulatedBalanceTypeInstance(OLEConstants.BALANCE_TYPE_ACTUAL);
112 setSelectedBalanceType(selectedBalanceType);
113 setOriginalBalanceType(selectedBalanceType.getCode());
114
115 sourceLine.setEncumbranceUpdateCode(null);
116 }
117 }
118
119 /**
120 * This method retrieves the list of valid balance types to display.
121 *
122 * @return List
123 */
124 public List getBalanceTypes() {
125 return balanceTypes;
126 }
127
128 /**
129 * This method sets the selected balance type.
130 *
131 * @return BalanceTyp
132 */
133 public BalanceType getSelectedBalanceType() {
134 return selectedBalanceType;
135 }
136
137 /**
138 * This method retrieves the selected balance type.
139 *
140 * @param selectedBalanceType
141 */
142 public void setSelectedBalanceType(BalanceType selectedBalanceType) {
143 this.selectedBalanceType = selectedBalanceType;
144 }
145
146 /**
147 * This method sets the list of valid balance types to display.
148 *
149 * @param balanceTypes
150 */
151 public void setBalanceTypes(List balanceTypes) {
152 this.balanceTypes = balanceTypes;
153 }
154
155 /**
156 * This method returns the journal voucher document associated with this form.
157 *
158 * @return Returns the journalVoucherDocument.
159 */
160 public JournalVoucherDocument getJournalVoucherDocument() {
161 return (JournalVoucherDocument) getTransactionalDocument();
162 }
163
164 /**
165 * This method sets the journal voucher document associated with this form.
166 *
167 * @param journalVoucherDocument The journalVoucherDocument to set.
168 */
169 public void setJournalVoucherDocument(JournalVoucherDocument journalVoucherDocument) {
170 setDocument(journalVoucherDocument);
171 }
172
173 /**
174 * This method retrieves the originalBalanceType attribute.
175 *
176 * @return String
177 */
178 public String getOriginalBalanceType() {
179 return originalBalanceType;
180 }
181
182 /**
183 * This method sets the originalBalanceType attribute.
184 *
185 * @param changedBalanceType
186 */
187 public void setOriginalBalanceType(String changedBalanceType) {
188 this.originalBalanceType = changedBalanceType;
189 }
190
191 /**
192 * Using the selected accounting period to determine university fiscal year and look up all the encumbrance
193 * balance type - check if the selected balance type is for encumbrance
194 *
195 * @return true/false - true if it is an encumbrance balance type
196 */
197 public boolean getIsEncumbranceBalanceType(){
198 //get encumbrance balance type list
199 BalanceTypeService balanceTypeSerivce = SpringContext.getBean(BalanceTypeService.class);
200 List<String> encumbranceBalanceTypes = balanceTypeSerivce.getEncumbranceBalanceTypes(getSelectedPostingYear());
201
202 return encumbranceBalanceTypes.contains(selectedBalanceType.getCode());
203 }
204
205 /**
206 * This method retrieves all of the balance types in the system and prepares them to be rendered in a dropdown UI component.
207 */
208 protected void populateBalanceTypeListForRendering() {
209 // grab the list of valid balance types
210 ArrayList balanceTypes = new ArrayList(SpringContext.getBean(BalanceTypeService.class).getAllBalanceTypes());
211
212 // set into the form for rendering
213 this.setBalanceTypes(balanceTypes);
214
215 String selectedBalanceTypeCode = getSelectedBalanceType().getCode();
216 if (StringUtils.isBlank(selectedBalanceTypeCode)) {
217 selectedBalanceTypeCode = OLEConstants.BALANCE_TYPE_ACTUAL;
218 }
219
220 setSelectedBalanceType(getPopulatedBalanceTypeInstance(selectedBalanceTypeCode));
221 getJournalVoucherDocument().setBalanceTypeCode(selectedBalanceTypeCode);
222 }
223
224 /**
225 * This method will fully populate a balance type given the passed in code, by calling the business object service that
226 * retrieves the rest of the instances' information.
227 *
228 * @param balanceTypeCode
229 * @return BalanceTyp
230 */
231 protected BalanceType getPopulatedBalanceTypeInstance(String balanceTypeCode) {
232 // now we have to get the code and the name of the original and new balance types
233 BalanceTypeService bts = SpringContext.getBean(BalanceTypeService.class);
234 return bts.getBalanceTypeByCode(balanceTypeCode);
235 }
236
237 /**
238 * If the balance type is an offset generation balance type, then the user is able to enter the amount as either a debit or a
239 * credit, otherwise, they only need to deal with the amount field in this case we always need to update the underlying bo so
240 * that the debit/credit code along with the amount, is properly set.
241 */
242 protected void populateCreditAndDebitAmounts() {
243 if (isSelectedBalanceTypeFinancialOffsetGenerationIndicator()) {
244 super.populateCreditAndDebitAmounts();
245 }
246 }
247
248 /**
249 * This is a convenience helper method that is used several times throughout this action class to determine if the selected
250 * balance type contained within the form instance is a financial offset generation balance type or not.
251 *
252 * @return boolean True if it is an offset generation balance type, false otherwise.
253 */
254 protected boolean isSelectedBalanceTypeFinancialOffsetGenerationIndicator() {
255 return getPopulatedBalanceTypeInstance(getSelectedBalanceType().getCode()).isFinancialOffsetGenerationIndicator();
256 }
257 }