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.external.kc.service.impl;
017
018 import java.util.ArrayList;
019 import java.util.List;
020
021 import org.kuali.kfs.coa.businessobject.Account;
022 import org.kuali.kfs.coa.businessobject.ObjectCode;
023 import org.kuali.kfs.coa.service.ObjectCodeService;
024 import org.kuali.kfs.fp.businessobject.BudgetAdjustmentAccountingLine;
025 import org.kuali.kfs.fp.businessobject.BudgetAdjustmentSourceAccountingLine;
026 import org.kuali.kfs.fp.businessobject.BudgetAdjustmentTargetAccountingLine;
027 import org.kuali.kfs.fp.document.BudgetAdjustmentDocument;
028 import org.kuali.kfs.integration.cg.ContractsAndGrantsConstants;
029 import org.kuali.kfs.integration.cg.dto.BudgetAdjustmentCreationStatusDTO;
030 import org.kuali.kfs.integration.cg.dto.BudgetAdjustmentParametersDTO;
031 import org.kuali.kfs.integration.cg.dto.BudgetAdjustmentParametersDTO.Details;
032 import org.kuali.kfs.integration.cg.service.AccountCreationService;
033 import org.kuali.kfs.integration.cg.service.BudgetAdjustmentService;
034 import org.kuali.kfs.module.external.kc.util.GlobalVariablesExtractHelper;
035 import org.kuali.kfs.module.external.kc.util.KcUtils;
036 import org.kuali.kfs.sys.KFSConstants;
037 import org.kuali.kfs.sys.businessobject.AccountingLine;
038 import org.kuali.kfs.sys.context.SpringContext;
039 import org.kuali.rice.kim.bo.Person;
040 import org.kuali.rice.kim.service.KIMServiceLocator;
041 import org.kuali.rice.kim.service.PersonService;
042 import org.kuali.rice.kns.UserSession;
043 import org.kuali.rice.kns.document.Document;
044 import org.kuali.rice.kns.document.authorization.DocumentAuthorizer;
045 import org.kuali.rice.kns.document.authorization.TransactionalDocumentAuthorizerBase;
046 import org.kuali.rice.kns.exception.ValidationException;
047 import org.kuali.rice.kns.rule.event.BlanketApproveDocumentEvent;
048 import org.kuali.rice.kns.rule.event.RouteDocumentEvent;
049 import org.kuali.rice.kns.rule.event.SaveDocumentEvent;
050 import org.kuali.rice.kns.service.BusinessObjectService;
051 import org.kuali.rice.kns.service.DataDictionaryService;
052 import org.kuali.rice.kns.service.DocumentService;
053 import org.kuali.rice.kns.service.KualiRuleService;
054 import org.kuali.rice.kns.service.MaintenanceDocumentDictionaryService;
055 import org.kuali.rice.kns.service.ParameterService;
056 import org.kuali.rice.kns.service.TransactionalDocumentDictionaryService;
057 import org.kuali.rice.kns.util.GlobalVariables;
058 import org.kuali.rice.kns.util.KualiDecimal;
059
060 public class BudgetAdjustmentServiceImpl implements BudgetAdjustmentService {
061
062 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BudgetAdjustmentServiceImpl.class);
063
064 private DocumentService documentService;
065 private ParameterService parameterService;
066 private DataDictionaryService dataDictionaryService;
067 private BusinessObjectService businessObjectService;
068
069 /**
070 * This is the web service method that facilitates budget adjustment 1. Creates a Budget Adjustment Doc using the parameters
071 * from KC 2. Returns the status object
072 *
073 * @param BudgetAdjustmentParametersDTO
074 * @return BudgetAdjustmentStatusDTO
075 */
076 public BudgetAdjustmentCreationStatusDTO createBudgetAdjustment(BudgetAdjustmentParametersDTO budgetAdjustmentParameters) {
077 BudgetAdjustmentDocument budgetAdjustmentDoc = null;
078
079 BudgetAdjustmentCreationStatusDTO budgetAdjustmentCreationStatus = new BudgetAdjustmentCreationStatusDTO();
080 budgetAdjustmentCreationStatus.setErrorMessages(new ArrayList<String>());
081 budgetAdjustmentCreationStatus.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_SUCCESS);
082
083 // check to see if the user has the permission to create account
084 String principalId = budgetAdjustmentParameters.getPrincipalId();
085 if (!isValidUser(principalId)) {
086 budgetAdjustmentCreationStatus.getErrorMessages().add(KcUtils.getErrorMessage(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_INVALID_USER, new String[]{principalId}));
087 budgetAdjustmentCreationStatus.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_FAILURE);
088 return budgetAdjustmentCreationStatus;
089 }
090 try {
091 // create a Budget Adjustment object
092 budgetAdjustmentDoc = createBudgetAdjustmentObject( budgetAdjustmentCreationStatus);
093
094 if (!isValidParameters(budgetAdjustmentDoc.getPostingYear(), budgetAdjustmentCreationStatus, budgetAdjustmentParameters)) {
095 return budgetAdjustmentCreationStatus;
096 }
097
098 // create a Budget Adjustment object, then route if successful
099 if( populateBudgetAdjustmentDocDetails(budgetAdjustmentParameters, budgetAdjustmentDoc, budgetAdjustmentCreationStatus) ){
100 routeBudgetAdjustmentDocument(budgetAdjustmentDoc, budgetAdjustmentCreationStatus);
101 }else{
102 //return as we have a failure
103 return budgetAdjustmentCreationStatus;
104 }
105
106 }
107 catch (Exception ex) {
108 this.setFailStatus(budgetAdjustmentCreationStatus, ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_ACCOUNT_GENERATION_PROBLEM);
109 return budgetAdjustmentCreationStatus;
110 }
111 // set required values to AccountCreationStatus
112
113 if (budgetAdjustmentCreationStatus.getStatus().equals(ContractsAndGrantsConstants.KcWebService.STATUS_KC_SUCCESS) && getDocumentService().documentExists(budgetAdjustmentDoc.getDocumentHeader().getDocumentNumber())) {
114 budgetAdjustmentCreationStatus.setDocumentNumber(budgetAdjustmentDoc.getDocumentNumber());
115 }
116 else {
117 // save the document
118 try {
119 try{
120 GlobalVariables.getMessageMap().clearErrorMessages();
121 getDocumentService().saveDocument(budgetAdjustmentDoc);
122 }catch(ValidationException ve){
123 }
124 budgetAdjustmentCreationStatus.setDocumentNumber(budgetAdjustmentDoc.getDocumentNumber());
125 }
126 catch (Exception ex) {
127 LOG.error( KcUtils.getErrorMessage(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_WORKFLOW_EXCEPTION_DOCUMENT_NOT_SAVED, null) + ": " + ex.getMessage());
128 budgetAdjustmentCreationStatus.setErrorMessages(GlobalVariablesExtractHelper.extractGlobalVariableErrors());
129 budgetAdjustmentCreationStatus.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_FAILURE);
130
131 }
132
133 }
134 return budgetAdjustmentCreationStatus;
135 }
136
137 protected boolean checkforEmptyField(BudgetAdjustmentCreationStatusDTO budgetAdjustmentCreationStatusDTO, String fieldName, String value, int lineNumber) {
138 if ((value == null) || value.isEmpty()) {
139 if (lineNumber != 0)
140 value = "Detail " + lineNumber + " " + value;
141 String message = GlobalVariablesExtractHelper.replaceTokens(ContractsAndGrantsConstants.BudgetAdjustmentService.AUTOMATCICG_ACCOUNT_MAINTENANCE_CHART_REQUIRED_FIELD, fieldName);
142 this.setFailStatus(budgetAdjustmentCreationStatusDTO, message);
143 return false;
144 }
145 return true;
146 }
147
148
149 protected void setFailStatus(BudgetAdjustmentCreationStatusDTO budgetAdjustmentCreationStatusDTO, String message) {
150 budgetAdjustmentCreationStatusDTO.getErrorMessages().add(message);
151 budgetAdjustmentCreationStatusDTO.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_FAILURE);
152 }
153
154 protected boolean isValidParameters(Integer postingFiscalYear, BudgetAdjustmentCreationStatusDTO budgetAdjustmentCreationStatusDTO, BudgetAdjustmentParametersDTO budgetAdjustmentParameters) {
155 boolean isValid = true;
156 boolean isValidAcct = true;
157 isValid &= checkforEmptyField(budgetAdjustmentCreationStatusDTO, "Description", budgetAdjustmentParameters.getDescription(), 0);
158 List<Details> details = budgetAdjustmentParameters.getDetails();
159 AccountCreationService accountCreationService = SpringContext.getBean(AccountCreationService.class);
160 ObjectCodeService objectCodeService = SpringContext.getBean(ObjectCodeService.class);
161 int lineNumber = 0;
162 for (Details detail : details) {
163 lineNumber++;
164 isValid &= checkforEmptyField(budgetAdjustmentCreationStatusDTO, "Account", detail.getAccount(), lineNumber);
165 isValid &= checkforEmptyField(budgetAdjustmentCreationStatusDTO, "Chart", detail.getChart(), lineNumber);
166 isValid &= checkforEmptyField(budgetAdjustmentCreationStatusDTO, "Object Code", detail.getObjectCode(), lineNumber);
167 isValid &= checkforEmptyField(budgetAdjustmentCreationStatusDTO, "Amount", detail.getCurrentAmount(), lineNumber);
168 if (!KualiDecimal.isNumeric(detail.getCurrentAmount())) {
169 isValid = false;
170 String message = GlobalVariablesExtractHelper.replaceTokens(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_AMT_IS_NONUMERIC, detail.getObjectCode(), detail.getCurrentAmount());
171 this.setFailStatus(budgetAdjustmentCreationStatusDTO, message);
172 }
173 else {
174 // test if amount is non zero
175 KualiDecimal amt = new KualiDecimal(detail.getCurrentAmount());
176 if (amt.isZero()) {
177 isValid = false;
178 String message = GlobalVariablesExtractHelper.replaceTokens(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_AMT_IS_NONUMERIC, detail.getObjectCode(), detail.getCurrentAmount());
179 this.setFailStatus(budgetAdjustmentCreationStatusDTO, message);
180 }
181 }
182 if (isValidAcct && (!accountCreationService.isValidChartAccount(detail.getChart(), detail.getAccount()))) {
183 isValid = false;
184 isValidAcct = false;
185 String message = GlobalVariablesExtractHelper.replaceTokens(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_INVALID_ACCT, detail.getChart(), detail.getAccount());
186 this.setFailStatus(budgetAdjustmentCreationStatusDTO, message);
187 }
188 else {
189
190 ObjectCode objCode = objectCodeService.getByPrimaryId(postingFiscalYear, detail.getChart(), detail.getObjectCode());
191 if (objCode == null) {
192 isValid = false;
193 String message = GlobalVariablesExtractHelper.replaceTokens(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_INVALID_OBJECTCODE, detail.getChart(), detail.getObjectCode());
194 this.setFailStatus(budgetAdjustmentCreationStatusDTO, message);
195 } else if (!objCode.isFinancialObjectActiveCode()) {
196 isValid = false;
197 String message = GlobalVariablesExtractHelper.replaceTokens(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_INACTIVE_OBJECTCODE, detail.getChart(), detail.getObjectCode(), postingFiscalYear.toString());
198 this.setFailStatus(budgetAdjustmentCreationStatusDTO, message);
199 }
200 }
201 }
202 return isValid;
203 }
204
205 /**
206 * This method creates an account to be used for automatic maintenance document
207 *
208 * @param AccountParametersDTO
209 * @return Account
210 */
211 protected BudgetAdjustmentDocument createBudgetAdjustmentObject(BudgetAdjustmentCreationStatusDTO budgetAdjustmentCreationStatus) {
212 BudgetAdjustmentDocument budgetAdjustmentDocument = (BudgetAdjustmentDocument) createBADocument(budgetAdjustmentCreationStatus);
213 // also populates posting year
214 budgetAdjustmentDocument.initiateDocument();
215 return budgetAdjustmentDocument;
216 }
217
218 protected boolean populateBudgetAdjustmentDocDetails(BudgetAdjustmentParametersDTO parameters, BudgetAdjustmentDocument budgetAdjustmentDocument, BudgetAdjustmentCreationStatusDTO budgetAdjustmentCreationStatus) {
219
220 boolean methodSuccessful = true;
221
222 // The Description of the BA document should carry the Award Document Number and Budget Version Number.
223 budgetAdjustmentDocument.getDocumentHeader().setDocumentDescription(parameters.getDescription());
224 budgetAdjustmentDocument.getDocumentHeader().setExplanation(parameters.getExplanation());
225 budgetAdjustmentDocument.getDocumentHeader().setOrganizationDocumentNumber(parameters.getOrgDocNumber());
226 KualiDecimal runningtotal = KualiDecimal.ZERO;
227 Integer fiscalYear = budgetAdjustmentDocument.getPostingYear();
228 if (parameters.getDetails() != null) {
229 for (BudgetAdjustmentParametersDTO.Details detail : parameters.getDetails()) {
230 if (KualiDecimal.isNumeric(detail.getCurrentAmount())) {
231 KualiDecimal amount = new KualiDecimal(detail.getCurrentAmount());
232 runningtotal = runningtotal.add(amount);
233 if (amount.isPositive()) {
234 budgetAdjustmentDocument.addTargetAccountingLine(createBudgetAdjustmentTargetAccountingLine(detail,fiscalYear));
235 }
236 else {
237 budgetAdjustmentDocument.addSourceAccountingLine(createBudgetAdjustmentSourceAccountingLine(detail,fiscalYear));
238 }
239 }
240 }
241 if (runningtotal.isNonZero()) {
242 boolean success = this.generateIncomeAccountingLine(fiscalYear, parameters.getSponsorType(), budgetAdjustmentDocument, runningtotal);
243 if (!success) {
244 budgetAdjustmentCreationStatus.getErrorMessages().add(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_SYSTEM_PARAMETER_INCORRECT_VALUE + ContractsAndGrantsConstants.BudgetAdjustmentService.PARAMETER_INCOME_OBJECT_CODES_BY_SPONSOR_TYPE);
245 budgetAdjustmentCreationStatus.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_FAILURE);
246 methodSuccessful = false;
247 }
248 }
249 }
250
251 return methodSuccessful;
252 }
253
254 protected void populateAccountingLine(BudgetAdjustmentAccountingLine acctLine, Integer postingYear, String chart, String accountNumber, String proj, String objCode, KualiDecimal currentBudgetAdjustmentAmount) {
255 acctLine.setChartOfAccountsCode(chart);
256 acctLine.setAccountNumber(accountNumber);
257 if ((proj != null) && (!proj.isEmpty()))
258 acctLine.setProjectCode(proj);
259 acctLine.setFinancialObjectCode(objCode);
260 acctLine.setCurrentBudgetAdjustmentAmount(currentBudgetAdjustmentAmount);
261 acctLine.setPostingYear(postingYear);
262 acctLine.refresh();
263 }
264
265 protected BudgetAdjustmentSourceAccountingLine createBudgetAdjustmentSourceAccountingLine(BudgetAdjustmentParametersDTO.Details detail, Integer postingYear) {
266
267 BudgetAdjustmentSourceAccountingLine budgetAdjustmentSourceAccountingLine = new BudgetAdjustmentSourceAccountingLine();
268 // from / decrease chart -account
269 KualiDecimal amount = new KualiDecimal(detail.getCurrentAmount()).abs();
270 populateAccountingLine(budgetAdjustmentSourceAccountingLine, postingYear, detail.getChart(), detail.getAccount(), detail.getProjectCode(), detail.getObjectCode(), amount);
271 return budgetAdjustmentSourceAccountingLine;
272 }
273
274 protected BudgetAdjustmentTargetAccountingLine createBudgetAdjustmentTargetAccountingLine(BudgetAdjustmentParametersDTO.Details detail, Integer postingYear) {
275 BudgetAdjustmentTargetAccountingLine budgetAdjustmentTargetAccountingLine = new BudgetAdjustmentTargetAccountingLine();
276 // TO / increase chart -account
277 KualiDecimal amount = new KualiDecimal(detail.getCurrentAmount()).abs();
278 populateAccountingLine(budgetAdjustmentTargetAccountingLine, postingYear, detail.getChart(), detail.getAccount(), detail.getProjectCode(), detail.getObjectCode(), amount);
279 return budgetAdjustmentTargetAccountingLine;
280
281 }
282
283 protected boolean generateIncomeAccountingLine(Integer postingYear, String sponsorType, BudgetAdjustmentDocument baDoc, KualiDecimal amount) {
284 BudgetAdjustmentParametersDTO.Details incomeDetail = new BudgetAdjustmentParametersDTO.Details();
285 if (!parameterService.parameterExists(BudgetAdjustmentDocument.class, ContractsAndGrantsConstants.BudgetAdjustmentService.PARAMETER_INCOME_OBJECT_CODES_BY_SPONSOR_TYPE))
286 return false;
287 String sponsorCodeMapValue = parameterService.getParameterValue(BudgetAdjustmentDocument.class, ContractsAndGrantsConstants.BudgetAdjustmentService.PARAMETER_INCOME_OBJECT_CODES_BY_SPONSOR_TYPE, sponsorType);
288 if (sponsorCodeMapValue == null)
289 return false;
290 if (amount.isNegative()) { // from side
291 AccountingLine accountingLineDetail = baDoc.getSourceAccountingLine(0);
292 BudgetAdjustmentSourceAccountingLine budgetAdjustmentSourceAccountingLine = new BudgetAdjustmentSourceAccountingLine();
293 populateAccountingLine(budgetAdjustmentSourceAccountingLine,postingYear, accountingLineDetail.getChartOfAccountsCode(), accountingLineDetail.getAccountNumber(), accountingLineDetail.getProjectCode(), sponsorCodeMapValue, amount.abs());
294 baDoc.addSourceAccountingLine(budgetAdjustmentSourceAccountingLine);
295 }
296 else {
297 AccountingLine accountingLineDetail = baDoc.getTargetAccountingLine(0);
298 BudgetAdjustmentTargetAccountingLine budgetAdjustmentTargetAccountingLine = new BudgetAdjustmentTargetAccountingLine();
299 populateAccountingLine(budgetAdjustmentTargetAccountingLine,postingYear, accountingLineDetail.getChartOfAccountsCode(), accountingLineDetail.getAccountNumber(), accountingLineDetail.getProjectCode(), sponsorCodeMapValue, amount.abs());
300 baDoc.addTargetAccountingLine(budgetAdjustmentTargetAccountingLine);
301 }
302 return true;
303 }
304
305
306 /**
307 * This method will use the DocumentService to create a new document. The documentTypeName is gathered by using
308 * MaintenanceDocumentDictionaryService which uses Account class to get the document type name.
309 *
310 * @param AccountCreationStatusDTO
311 * @return document returns a new document for the account document type or null if there is an exception thrown.
312 */
313 protected Document createBADocument(BudgetAdjustmentCreationStatusDTO budgetAdjustmentCreationStatusDTO) {
314 try {
315 Document document = getDocumentService().getNewDocument(SpringContext.getBean(TransactionalDocumentDictionaryService.class).getDocumentClassByName("BA"));
316 return document;
317 }
318 catch (Exception e) {
319 budgetAdjustmentCreationStatusDTO.setErrorMessages(GlobalVariablesExtractHelper.extractGlobalVariableErrors());
320 budgetAdjustmentCreationStatusDTO.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_FAILURE);
321 return null;
322
323
324 }
325 }
326
327 /**
328 * This method processes the workflow document actions like save, route and blanket approve depending on the
329 * ACCOUNT_AUTO_CREATE_ROUTE system parameter value. If the system parameter value is not of save or submit or blanketapprove,
330 * put an error message and quit. Throws an document WorkflowException if the specific document action fails to perform.
331 *
332 * @param maintenanceAccountDocument, errorMessages
333 * @return success returns true if the workflow document action is successful else return false.
334 */
335 protected boolean routeBudgetAdjustmentDocument(BudgetAdjustmentDocument budgetAdjustmentDocument, BudgetAdjustmentCreationStatusDTO budgetAdjustmentCreationStatus) {
336
337 try {
338 // getParameterService().setParameterForTesting(BudgetAdjustmentDocument.class,
339 // KcConstants.BudgetAdjustmentService.PARAMETER_KC_ADMIN_AUTO_BA_DOCUMENT_WORKFLOW_ROUTE,
340 // KFSConstants.WORKFLOW_DOCUMENT_ROUTE);
341
342 String BudgetAdjustAutoRouteValue = getParameterService().getParameterValue(BudgetAdjustmentDocument.class, ContractsAndGrantsConstants.BudgetAdjustmentService.PARAMETER_KC_ADMIN_AUTO_BA_DOCUMENT_WORKFLOW_ROUTE);
343 // String BudgetAdjustAutoRouteValue = getParameterService().getParameterValue(Account.class,
344 // KcConstants.BudgetAdjustmentService.PARAMETER_KC_BA_DOCUMENT_ROUTE);
345 // if the accountAutoCreateRouteValue is not save or submit or blanketApprove then put an error message and quit.
346 if (!BudgetAdjustAutoRouteValue.equalsIgnoreCase(KFSConstants.WORKFLOW_DOCUMENT_SAVE) && !BudgetAdjustAutoRouteValue.equalsIgnoreCase("submit") && !BudgetAdjustAutoRouteValue.equalsIgnoreCase(KFSConstants.WORKFLOW_DOCUMENT_BLANKET_APPROVE)) {
347 budgetAdjustmentCreationStatus.getErrorMessages().add(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_SYSTEM_PARAMETER_INCORRECT_DOCUMENT_ACTION_VALUE);
348 budgetAdjustmentCreationStatus.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_FAILURE);
349 return false;
350 }
351
352 if (BudgetAdjustAutoRouteValue.equalsIgnoreCase(KFSConstants.WORKFLOW_DOCUMENT_SAVE)) {
353 //attempt to save if apply rules were successful and there are no errors
354 boolean rulesPassed = SpringContext.getBean(KualiRuleService.class).applyRules(new SaveDocumentEvent(budgetAdjustmentDocument));
355
356 if( rulesPassed && GlobalVariables.getMessageMap().hasNoErrors()){
357 getDocumentService().saveDocument(budgetAdjustmentDocument);
358 }else{
359 //get errors from apply rules invocation, also clears global variables
360 budgetAdjustmentCreationStatus.setErrorMessages(GlobalVariablesExtractHelper.extractGlobalVariableErrors());
361 try{
362 //save document, and catch VE's as we want to do this silently
363 getDocumentService().saveDocument(budgetAdjustmentDocument);
364 }catch(ValidationException ve){}
365
366 budgetAdjustmentCreationStatus.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_SUCCESS);
367 LOG.error( KcUtils.getErrorMessage(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_BA_RULES_EXCEPTION, new String[]{budgetAdjustmentDocument.getDocumentNumber()}));
368
369 return false;
370 }
371
372 }
373 else if (BudgetAdjustAutoRouteValue.equalsIgnoreCase(KFSConstants.WORKFLOW_DOCUMENT_BLANKET_APPROVE)) {
374
375 //attempt to blanket approve if apply rules were successful and there are no errors
376 boolean rulesPassed = SpringContext.getBean(KualiRuleService.class).applyRules(new BlanketApproveDocumentEvent(budgetAdjustmentDocument));
377
378 if( rulesPassed && GlobalVariables.getMessageMap().hasNoErrors()){
379 getDocumentService().blanketApproveDocument(budgetAdjustmentDocument, "", null);
380 }else{
381 //get errors from apply rules invocation, also clears global variables
382 budgetAdjustmentCreationStatus.setErrorMessages(GlobalVariablesExtractHelper.extractGlobalVariableErrors());
383 try{
384 //save document, and catch VE's as we want to do this silently
385 getDocumentService().saveDocument(budgetAdjustmentDocument);
386 }catch(ValidationException ve){}
387
388 budgetAdjustmentCreationStatus.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_SUCCESS);
389 LOG.error( KcUtils.getErrorMessage(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_BA_RULES_EXCEPTION, new String[]{budgetAdjustmentDocument.getDocumentNumber()}));
390
391 return false;
392 }
393
394 }
395 else if (BudgetAdjustAutoRouteValue.equalsIgnoreCase("submit")) {
396
397 //attempt to blanket approve if apply rules were successful and there are no errors
398 boolean rulesPassed = SpringContext.getBean(KualiRuleService.class).applyRules(new RouteDocumentEvent(budgetAdjustmentDocument));
399
400 if( rulesPassed && GlobalVariables.getMessageMap().hasNoErrors()){
401 getDocumentService().routeDocument(budgetAdjustmentDocument, "", null);
402 }else{
403 //get errors from apply rules invocation, also clears global variables
404 budgetAdjustmentCreationStatus.setErrorMessages(GlobalVariablesExtractHelper.extractGlobalVariableErrors());
405 try{
406 //save document, and catch VE's as we want to do this silently
407 getDocumentService().saveDocument(budgetAdjustmentDocument);
408 }catch(ValidationException ve){}
409
410 budgetAdjustmentCreationStatus.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_SUCCESS);
411 LOG.error( KcUtils.getErrorMessage(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_BA_RULES_EXCEPTION, new String[]{budgetAdjustmentDocument.getDocumentNumber()}));
412
413 return false;
414 }
415
416 }
417 return true;
418
419 }
420 catch (Exception ex) {
421 LOG.error(KcUtils.getErrorMessage(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_WORKFLOW_EXCEPTION_DOCUMENT_ACTIONS,null) + ": " + ex.getMessage());
422 budgetAdjustmentCreationStatus.setErrorMessages(GlobalVariablesExtractHelper.extractGlobalVariableErrors());
423 budgetAdjustmentCreationStatus.getErrorMessages().add( KcUtils.getErrorMessage(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_WORKFLOW_EXCEPTION_DOCUMENT_ACTIONS, null) + ": " + ex.getMessage());
424 budgetAdjustmentCreationStatus.setStatus(ContractsAndGrantsConstants.KcWebService.STATUS_KC_FAILURE);
425 return false;
426 }
427 }
428
429 /**
430 * This method check to see if the user can create the account maintenance document and set the user session
431 *
432 * @param String principalId
433 * @return boolean
434 */
435
436 protected boolean isValidUser(String principalId) {
437
438 PersonService<Person> personService = KIMServiceLocator.getPersonService();
439
440 try {
441 Person user = personService.getPerson(principalId);
442 // Person user = personService.getPersonByPrincipalName(principalId);
443 DocumentAuthorizer documentAuthorizer = new TransactionalDocumentAuthorizerBase();
444 if (documentAuthorizer.canInitiate(SpringContext.getBean(MaintenanceDocumentDictionaryService.class).getDocumentTypeName(Account.class), user)) {
445 // set the user session so that the user name can be displayed in the saved document
446 GlobalVariables.setUserSession(new UserSession(user.getPrincipalName()));
447 return true;
448 }
449 else {
450 return false;
451 }
452 }
453 catch (Exception ex) {
454
455 LOG.error( KcUtils.getErrorMessage(ContractsAndGrantsConstants.BudgetAdjustmentService.ERROR_KC_DOCUMENT_INVALID_USER, new String[]{principalId}));
456 return false;
457 }
458 }
459
460
461 /**
462 * Gets the documentService attribute.
463 *
464 * @return Current value of documentService.
465 */
466 protected DocumentService getDocumentService() {
467 return documentService;
468 }
469
470 /**
471 * Sets the documentService attribute value.
472 *
473 * @param documentService
474 */
475 public void setDocumentService(DocumentService documentService) {
476 this.documentService = documentService;
477 }
478
479 /**
480 * Gets the parameterService attribute.
481 *
482 * @return Returns the parameterService.
483 */
484 protected ParameterService getParameterService() {
485 return parameterService;
486 }
487
488 /**
489 * Sets the parameterService attribute value.
490 *
491 * @param parameterService The parameterService to set.
492 */
493 public void setParameterService(ParameterService parameterService) {
494 this.parameterService = parameterService;
495 }
496
497 protected DataDictionaryService getDataDictionaryService() {
498 return dataDictionaryService;
499 }
500
501 public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
502 this.dataDictionaryService = dataDictionaryService;
503 }
504
505 /**
506 * Sets the businessObjectService attribute value.
507 *
508 * @param businessObjectService The businessObjectService to set.
509 */
510 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
511 this.businessObjectService = businessObjectService;
512 }
513
514 /**
515 * Gets the businessObjectService attribute.
516 *
517 * @return Returns the businessObjectService.
518 */
519 protected BusinessObjectService getBusinessObjectService() {
520 return businessObjectService;
521 }
522
523 }