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 package org.kuali.kfs.module.cab.document.web.struts;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020 import java.util.HashMap;
021 import java.util.List;
022 import java.util.Map;
023
024 import javax.servlet.http.HttpServletRequest;
025 import javax.servlet.http.HttpServletResponse;
026
027 import org.apache.struts.action.ActionForm;
028 import org.apache.struts.action.ActionForward;
029 import org.apache.struts.action.ActionMapping;
030 import org.kuali.kfs.fp.businessobject.CapitalAssetInformation;
031 import org.kuali.kfs.module.cab.CabConstants;
032 import org.kuali.kfs.module.cab.CabKeyConstants;
033 import org.kuali.kfs.module.cab.CabPropertyConstants;
034 import org.kuali.kfs.module.cab.businessobject.GeneralLedgerEntry;
035 import org.kuali.kfs.module.cab.document.service.GlAndPurApHelperService;
036 import org.kuali.kfs.module.cab.document.service.GlLineService;
037 import org.kuali.kfs.module.cam.CamsConstants.DocumentTypeName;
038 import org.kuali.kfs.sys.context.SpringContext;
039 import org.kuali.rice.core.util.RiceConstants;
040 import org.kuali.rice.kns.document.Document;
041 import org.kuali.rice.kns.service.BusinessObjectService;
042 import org.kuali.rice.kns.util.GlobalVariables;
043 import org.kuali.rice.kns.util.KNSConstants;
044 import org.kuali.rice.kns.util.ObjectUtils;
045
046 /**
047 * Struts action class that handles GL Line Processing Screen actions
048 */
049 public class GlLineAction extends CabActionBase {
050
051 /**
052 * Action "process" from CAB GL Lookup screen is processed by this method
053 *
054 * @param mapping {@link ActionMapping}
055 * @param form {@link ActionForm}
056 * @param request {@link HttpServletRequest}
057 * @param response {@link HttpServletResponse}
058 * @return {@link ActionForward}
059 * @throws Exception
060 */
061 public ActionForward process(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
062 GlLineForm glLineForm = (GlLineForm) form;
063 GeneralLedgerEntry entry = findGeneralLedgerEntry(request);
064 if (ObjectUtils.isNotNull(entry)) {
065 prepareRecordsForDisplay(glLineForm, entry);
066 }
067 if (!entry.isActive()) {
068 GlobalVariables.getMessageList().add(CabKeyConstants.WARNING_GL_PROCESSED);
069 }
070 return mapping.findForward(RiceConstants.MAPPING_BASIC);
071 }
072
073 private void prepareRecordsForDisplay(GlLineForm glLineForm, GeneralLedgerEntry entry) {
074 BusinessObjectService boService = SpringContext.getBean(BusinessObjectService.class);
075 GlLineService glLineService = SpringContext.getBean(GlLineService.class);
076 Map<String, Object> fieldValues = new HashMap<String, Object>();
077 fieldValues.put(CabPropertyConstants.DOCUMENT_NUMBER, entry.getDocumentNumber());
078 // fieldValues.put(CabPropertyConstants.ACTIVE, true);
079 Collection<GeneralLedgerEntry> entries = boService.findMatchingOrderBy(GeneralLedgerEntry.class, fieldValues, CabPropertyConstants.GeneralLedgerEntry.GENERAL_LEDGER_ACCOUNT_IDENTIFIER, true);
080 List<GeneralLedgerEntry> fullList = new ArrayList<GeneralLedgerEntry>();
081 // make the default one as the first one
082 entry.setSelected(true);
083 fullList.add(0, entry);
084
085 for (GeneralLedgerEntry generalLedgerEntry : entries) {
086 if (!generalLedgerEntry.getGeneralLedgerAccountIdentifier().equals(entry.getGeneralLedgerAccountIdentifier())) {
087 generalLedgerEntry.setSelected(false);
088 fullList.add(generalLedgerEntry);
089 }
090 }
091 glLineForm.setRelatedGlEntries(fullList);
092 glLineForm.setPrimaryGlAccountId(entry.getGeneralLedgerAccountIdentifier());
093 CapitalAssetInformation capitalAssetInformation = glLineService.findCapitalAssetInformation(entry);
094 glLineForm.setCapitalAssetInformation(capitalAssetInformation);
095 }
096
097 /**
098 * Finds GL entry using the key from request
099 *
100 * @param request HttpServletRequest
101 * @return GeneralLedgerEntry
102 */
103 protected GeneralLedgerEntry findGeneralLedgerEntry(HttpServletRequest request) {
104 String glAcctId = request.getParameter(CabPropertyConstants.GeneralLedgerEntry.GENERAL_LEDGER_ACCOUNT_IDENTIFIER);
105 Long cabGlEntryId = Long.valueOf(glAcctId);
106 return findGeneralLedgerEntry(cabGlEntryId, false);
107 }
108
109
110 /**
111 * Action "Create Assets" from CAB GL Detail Selection screen is processed by this method. This will initiate an asset global
112 * document and redirect the user to document edit page.
113 *
114 * @param mapping ActionMapping
115 * @param form ActionForm
116 * @param request HttpServletRequest
117 * @param response HttpServletResponse
118 * @return ActionForward
119 * @throws Exception
120 */
121 public ActionForward submitAssetGlobal(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
122 GlLineForm glLineForm = (GlLineForm) form;
123 GlLineService glLineService = SpringContext.getBean(GlLineService.class);
124 GeneralLedgerEntry defaultGeneralLedgerEntry = findGeneralLedgerEntry(glLineForm.getPrimaryGlAccountId(), true);
125 List<GeneralLedgerEntry> submitList = prepareSubmitList(glLineForm, defaultGeneralLedgerEntry);
126 if (submitList.isEmpty()) {
127 form.reset(mapping, request);
128 return mapping.findForward(RiceConstants.MAPPING_BASIC);
129 }
130
131 // set the default as the first entry in the list if it's null
132 if (ObjectUtils.isNull(defaultGeneralLedgerEntry)) {
133 defaultGeneralLedgerEntry = submitList.get(0);
134 }
135
136 Document maintDoc = glLineService.createAssetGlobalDocument(submitList, defaultGeneralLedgerEntry);
137 List<GeneralLedgerEntry> pendingList = new ArrayList<GeneralLedgerEntry>();
138 preparePendingForAction(mapping, request, glLineForm, maintDoc, pendingList);
139 if (!pendingList.isEmpty()) {
140 return mapping.findForward(RiceConstants.MAPPING_BASIC);
141 }
142 return new ActionForward(getGlAndPurApHelperService().getDocHandlerUrl(maintDoc.getDocumentNumber(), DocumentTypeName.ASSET_ADD_GLOBAL), true);
143 }
144
145 private void preparePendingForAction(ActionMapping mapping, HttpServletRequest request, GlLineForm glLineForm, Document maintDoc, List<GeneralLedgerEntry> pendingList) {
146 List<GeneralLedgerEntry> relatedGlEntries = glLineForm.getRelatedGlEntries();
147
148 for (GeneralLedgerEntry generalLedgerEntry : relatedGlEntries) {
149 if (!generalLedgerEntry.isSelected()) {
150 GeneralLedgerEntry entry = findGeneralLedgerEntry(generalLedgerEntry.getGeneralLedgerAccountIdentifier(), true);
151 if (entry != null && entry.isActive()) {
152 pendingList.add(entry);
153 }
154 }
155 }
156 if (!pendingList.isEmpty()) {
157 glLineForm.reset(mapping, request);
158 glLineForm.setPrimaryGlAccountId(pendingList.get(0).getGeneralLedgerAccountIdentifier());
159 glLineForm.setCurrDocNumber(maintDoc.getDocumentNumber());
160 GeneralLedgerEntry entry = findGeneralLedgerEntry(pendingList.get(0).getGeneralLedgerAccountIdentifier(), true);
161 prepareRecordsForDisplay(glLineForm, entry);
162 }
163 }
164
165 /**
166 * Helper method to prepare the submit list
167 *
168 * @param glLineForm ActionForm
169 * @param defaultGeneralLedgerEntry Default selected GL Entry
170 * @return List of submitted entries
171 * @throws Exception
172 */
173 protected List<GeneralLedgerEntry> prepareSubmitList(GlLineForm glLineForm, GeneralLedgerEntry defaultGeneralLedgerEntry) throws Exception {
174 BusinessObjectService boService = SpringContext.getBean(BusinessObjectService.class);
175 GlLineService glLineService = SpringContext.getBean(GlLineService.class);
176 List<GeneralLedgerEntry> submitList = new ArrayList<GeneralLedgerEntry>();
177 if (defaultGeneralLedgerEntry != null) {
178 defaultGeneralLedgerEntry.setSelected(true);
179 }
180
181 List<GeneralLedgerEntry> relatedGlEntries = glLineForm.getRelatedGlEntries();
182 for (GeneralLedgerEntry generalLedgerEntry : relatedGlEntries) {
183 if (generalLedgerEntry.isSelected()) {
184 GeneralLedgerEntry entry = findGeneralLedgerEntry(generalLedgerEntry.getGeneralLedgerAccountIdentifier(), true);
185 if (entry != null && entry.isActive()) {
186 submitList.add(entry);
187 }
188 }
189 }
190 return submitList;
191 }
192
193 /**
194 * Action "Create Payments" from CAB GL Detail Selection screen is processed by this method. This will initiate an asset payment
195 * global document and redirect the user to document edit page.
196 *
197 * @param mapping ActionMapping
198 * @param form ActionForm
199 * @param request HttpServletRequest
200 * @param response HttpServletResponse
201 * @return ActionForward
202 * @throws Exception
203 */
204 public ActionForward submitPaymentGlobal(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
205 GlLineService glLineService = SpringContext.getBean(GlLineService.class);
206 GlLineForm glLineForm = (GlLineForm) form;
207 GeneralLedgerEntry defaultGeneralLedgerEntry = findGeneralLedgerEntry(glLineForm.getPrimaryGlAccountId(), true);
208
209 List<GeneralLedgerEntry> submitList = prepareSubmitList(glLineForm, defaultGeneralLedgerEntry);
210 if (submitList.isEmpty()) {
211 form.reset(mapping, request);
212 return mapping.findForward(RiceConstants.MAPPING_BASIC);
213 }
214
215 // set the default as the first entry in the list if it's null
216 if (ObjectUtils.isNull(defaultGeneralLedgerEntry)) {
217 defaultGeneralLedgerEntry = submitList.get(0);
218 }
219
220 Document document = glLineService.createAssetPaymentDocument(submitList, defaultGeneralLedgerEntry);
221 List<GeneralLedgerEntry> pendingList = new ArrayList<GeneralLedgerEntry>();
222 preparePendingForAction(mapping, request, glLineForm, document, pendingList);
223 if (!pendingList.isEmpty()) {
224 return mapping.findForward(RiceConstants.MAPPING_BASIC);
225 }
226 return new ActionForward(getGlAndPurApHelperService().getDocHandlerUrl(document.getDocumentNumber(), DocumentTypeName.ASSET_PAYMENT), true);
227 }
228
229 /**
230 * Retrieves the CAB General Ledger Entry from DB
231 *
232 * @param generalLedgerEntryId Entry Id
233 * @return GeneralLedgerEntry
234 */
235 protected GeneralLedgerEntry findGeneralLedgerEntry(Long generalLedgerEntryId, boolean requireNew) {
236 BusinessObjectService boService = SpringContext.getBean(BusinessObjectService.class);
237 Map<String, Object> pkeys = new HashMap<String, Object>();
238 pkeys.put(CabPropertyConstants.GeneralLedgerEntry.GENERAL_LEDGER_ACCOUNT_IDENTIFIER, generalLedgerEntryId);
239 if (requireNew) {
240 pkeys.put(CabPropertyConstants.GeneralLedgerEntry.ACTIVITY_STATUS_CODE, CabConstants.ActivityStatusCode.NEW);
241 }
242 GeneralLedgerEntry entry = (GeneralLedgerEntry) boService.findByPrimaryKey(GeneralLedgerEntry.class, pkeys);
243 return entry;
244 }
245
246 /**
247 * Cancels the action and returns to portal main page
248 *
249 * @param mapping {@link ActionMapping}
250 * @param form {@link ActionForm}
251 * @param request {@link HttpServletRequest}
252 * @param response {@link HttpServletResponse}
253 * @return {@link ActionForward}
254 * @throws Exception
255 */
256 public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
257 return mapping.findForward(KNSConstants.MAPPING_PORTAL);
258 }
259
260 /**
261 * @see org.kuali.rice.kns.web.struts.action.KualiAction#showAllTabs(org.apache.struts.action.ActionMapping,
262 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
263 */
264 @Override
265 public ActionForward showAllTabs(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
266 GlLineForm glLineForm = (GlLineForm) form;
267 List<GeneralLedgerEntry> relatedGlEntries = glLineForm.getRelatedGlEntries();
268 for (GeneralLedgerEntry generalLedgerEntry : relatedGlEntries) {
269 if (generalLedgerEntry.getGeneralLedgerAccountIdentifier().equals(glLineForm.getPrimaryGlAccountId())) {
270 generalLedgerEntry.setSelected(true);
271 }
272 }
273 return super.showAllTabs(mapping, form, request, response);
274 }
275
276 public ActionForward reload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
277 GlLineForm glLineForm = (GlLineForm) form;
278 glLineForm.getRelatedGlEntries().clear();
279 GeneralLedgerEntry entry = findGeneralLedgerEntry(glLineForm.getPrimaryGlAccountId(), false);
280 if (entry != null) {
281 prepareRecordsForDisplay(glLineForm, entry);
282 }
283 return mapping.findForward(RiceConstants.MAPPING_BASIC);
284 }
285
286 protected GlAndPurApHelperService getGlAndPurApHelperService() {
287 return SpringContext.getBean(GlAndPurApHelperService.class);
288 }
289 }