/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.tem.document.web.struts;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.kuali.kfs.module.tem.TemConstants;
import org.kuali.kfs.module.tem.TemKeyConstants;
import org.kuali.kfs.module.tem.TemWorkflowConstants;
import org.kuali.kfs.module.tem.businessobject.TemProfile;
import org.kuali.kfs.module.tem.businessobject.TemProfileAccount;
import org.kuali.kfs.module.tem.document.CardApplicationDocument;
import org.kuali.kfs.module.tem.document.TemCorporateCardApplicationDocument;
import org.kuali.kfs.module.tem.document.service.TravelDocumentService;
import org.kuali.kfs.module.tem.service.TemProfileService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.web.struts.FinancialSystemTransactionalDocumentActionBase;
import org.kuali.rice.core.api.config.property.ConfigurationService;
import org.kuali.rice.core.api.util.RiceKeyConstants;
import org.kuali.rice.kew.api.KewApiConstants;
import org.kuali.rice.kew.api.KewApiServiceLocator;
import org.kuali.rice.kew.api.document.attribute.DocumentAttributeIndexingQueue;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase;
import org.kuali.rice.krad.exception.AuthorizationException;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.UrlFactory;
public class TemCardApplicationAction extends FinancialSystemTransactionalDocumentActionBase {
private final static String CTS_ACTION = "temCTSCardApplication.do";
private final static String CORP_ACTION = "temCorporateCardApplication.do";
private final static String QUESTION_FORWARD = "cardQuestion";
private final static String ERROR_FORWARD = "cardApplicationError";
@Override
public ActionForward docHandler(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
ActionForward forward = super.docHandler(mapping, form, request, response);
Person currentUser = GlobalVariables.getUserSession().getPerson();
TemCardApplicationForm applicationForm = (TemCardApplicationForm)form;
String command = applicationForm.getCommand();
if (StringUtils.equals(KewApiConstants.INITIATE_COMMAND,command)) {
final TemProfile profile = SpringContext.getBean(TemProfileService.class).findTemProfileByPrincipalId(currentUser.getPrincipalId());
if (profile == null){
applicationForm.setEmptyProfile(true);
forward = mapping.findForward(ERROR_FORWARD);
} else {
if (StringUtils.isEmpty(profile.getDefaultAccount())){
applicationForm.setEmptyAccount(true);
forward = mapping.findForward(ERROR_FORWARD);
}
}
}
return forward;
}
/**
* @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#approve(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward approve(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
TemCardApplicationForm applicationForm = (TemCardApplicationForm)form;
CardApplicationDocument document = (CardApplicationDocument) applicationForm.getDocument();
if (document.getDocumentHeader().getWorkflowDocument().getApplicationDocumentStatus().equals(TemWorkflowConstants.RouteNodeNames.FISCAL_OFFICER_REVIEW)){
if (document instanceof TemCorporateCardApplicationDocument){
if (!((TemCorporateCardApplicationDocument)document).isDepartmentHeadAgreement()){
GlobalVariables.getMessageMap().putError("departmentHeadAgreement", TemKeyConstants.ERROR_TEM_CARD_APP_NO_AGREEMENT, "Department Head");
}
}
}
Person currentUser = GlobalVariables.getUserSession().getPerson();
if (SpringContext.getBean(TravelDocumentService.class).isTravelManager(currentUser)
&& document.getDocumentHeader().getWorkflowDocument().getApplicationDocumentStatus().equals(TemWorkflowConstants.RouteNodeNames.APPLIED_TO_BANK)){
document.sendAcknowledgement();
document.approvedByBank();
document.getDocumentHeader().getWorkflowDocument().setApplicationDocumentStatus(TemWorkflowConstants.RouteNodeNames.APPROVED_BY_BANK);
document.saveAppDocStatus();
final DocumentAttributeIndexingQueue documentAttributeIndexingQueue = KewApiServiceLocator.getDocumentAttributeIndexingQueue();
documentAttributeIndexingQueue.indexDocument(document.getDocumentHeader().getDocumentNumber());
}
return super.approve(mapping, form, request, response);
}
/**
* @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#disapprove(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward disapprove(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
TemCardApplicationForm applicationForm = (TemCardApplicationForm)form;
CardApplicationDocument document = (CardApplicationDocument) applicationForm.getDocument();
Person currentUser = GlobalVariables.getUserSession().getPerson();
if (SpringContext.getBean(TravelDocumentService.class).isTravelManager(currentUser)
&& document.getDocumentHeader().getWorkflowDocument().getApplicationDocumentStatus().equals(TemWorkflowConstants.RouteNodeNames.APPLIED_TO_BANK)){
document.sendAcknowledgement();
}
return super.disapprove(mapping, form, request, response);
}
/**
* @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#route(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward route(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
TemCardApplicationForm applicationForm = (TemCardApplicationForm)form;
CardApplicationDocument document = (CardApplicationDocument) applicationForm.getDocument();
if (applicationForm.getDocument().getDocumentHeader().getWorkflowDocument().isInitiated()){
if (!document.isUserAgreement()){
GlobalVariables.getMessageMap().putError("userAgreement", TemKeyConstants.ERROR_TEM_CARD_APP_NO_AGREEMENT, "User");
}
if (StringUtils.isEmpty(document.getDocumentHeader().getDocumentDescription())){
GlobalVariables.getMessageMap().putError("document.documentHeader.documentDescription", RiceKeyConstants.ERROR_REQUIRED, "Description");
}
}
return super.route(mapping, form, request, response);
}
public ActionForward applyToBank(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
TemCardApplicationForm applicationForm = (TemCardApplicationForm)form;
CardApplicationDocument document = (CardApplicationDocument) applicationForm.getDocument();
Person currentUser = GlobalVariables.getUserSession().getPerson();
if (!SpringContext.getBean(TravelDocumentService.class).isTravelManager(currentUser)){
throw new AuthorizationException(GlobalVariables.getUserSession().getPerson().getPrincipalName(), "Apply To Bank",this.getClass().getSimpleName());
}
document.applyToBank();
document.getDocumentHeader().getWorkflowDocument().setApplicationDocumentStatus(TemWorkflowConstants.RouteNodeNames.APPLIED_TO_BANK);
document.saveAppDocStatus();
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
public ActionForward submit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
TemCardApplicationForm applicationForm = (TemCardApplicationForm)form;
CardApplicationDocument document = (CardApplicationDocument) applicationForm.getDocument();
Person currentUser = GlobalVariables.getUserSession().getPerson();
if (!SpringContext.getBean(TravelDocumentService.class).isTravelManager(currentUser)){
throw new AuthorizationException(GlobalVariables.getUserSession().getPerson().getPrincipalName(), "Submit",this.getClass().getSimpleName());
}
document.getDocumentHeader().getWorkflowDocument().setApplicationDocumentStatus(TemWorkflowConstants.RouteNodeNames.PENDING_BANK_APPLICATION);
document.saveAppDocStatus();
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
@Override
protected void createDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException {
super.createDocument(kualiDocumentFormBase);
TemCardApplicationForm applicationForm = (TemCardApplicationForm) kualiDocumentFormBase;
final Person currentUser = GlobalVariables.getUserSession().getPerson();
TemProfile profile = SpringContext.getBean(TemProfileService.class).findTemProfileByPrincipalId(currentUser.getPrincipalId());
CardApplicationDocument document = (CardApplicationDocument)applicationForm.getDocument();
document.getDocumentHeader().getWorkflowDocument().setApplicationDocumentStatus(TemWorkflowConstants.RouteNodeNames.APPLICATION);
document.setTemProfile(profile);
document.setTemProfileId(profile.getProfileId());
profile.getTravelerTypeCode();
applicationForm.setInitiator(true);
}
public ActionForward checkExistingCard(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
ActionForward forward = null;
TemCardApplicationForm applicationForm = (TemCardApplicationForm) form;
Person currentUser = GlobalVariables.getUserSession().getPerson();
TemProfile profile = SpringContext.getBean(TemProfileService.class).findTemProfileByPrincipalId(currentUser.getPrincipalId());
if (profile == null) {
applicationForm.setEmptyProfile(true);
return mapping.findForward(ERROR_FORWARD);
}
if (profile.getAccounts() != null && profile.getAccounts().size() > 0){
boolean hasCardType = false;
for (TemProfileAccount account : profile.getAccounts()){
if (account.getCreditCardAgency().getTravelCardTypeCode().equals(TemConstants.TRAVEL_TYPE_CTS) && applicationForm.getDocTypeName().equals(TemConstants.TravelDocTypes.TRAVEL_CTS_CARD_DOCUMENT) ){
hasCardType = true;
break;
}
else if (account.getCreditCardAgency().getTravelCardTypeCode().equals(TemConstants.TRAVEL_TYPE_CORP) && applicationForm.getDocTypeName().equals(TemConstants.TravelDocTypes.TRAVEL_CORP_CARD_DOCUMENT)){
hasCardType = true;
break;
}
}
if (hasCardType){
ActionMessage message = new ActionMessage(TemKeyConstants.MESSAGE_CARD_EXISTS_PROMPT);
ActionMessages messages = new ActionMessages();
messages.add(ActionMessages.GLOBAL_MESSAGE, message);
saveMessages(request, messages);
forward = mapping.findForward("QUESTION_FORWARD");
}
}
if (forward == null) {
String basePath = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSConstants.APPLICATION_URL_KEY);
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.DOC_HANDLER_METHOD);
parameters.put(KFSConstants.PARAMETER_COMMAND, KewApiConstants.INITIATE_COMMAND);
parameters.put(KFSConstants.DOCUMENT_TYPE_NAME, applicationForm.getDocTypeName());
String action = applicationForm.getDocTypeName().equals(TemConstants.TravelDocTypes.TRAVEL_CTS_CARD_DOCUMENT) ? CTS_ACTION : CORP_ACTION;
String lookupUrl = UrlFactory.parameterizeUrl(basePath +"/"+ action, parameters);
forward = new ActionForward(lookupUrl, true);
}
return forward;
}
/**
* Returns the user to the index page.
*
* @param mapping
* @param form
* @param request
* @param response
* @throws Exception
*/
public ActionForward returnToIndex(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
return mapping.findForward(KFSConstants.MAPPING_PORTAL);
}
public ActionForward openNew(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
TemCardApplicationForm applicationForm = (TemCardApplicationForm) form;
String basePath = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSConstants.APPLICATION_URL_KEY);
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.DOC_HANDLER_METHOD);
parameters.put(KFSConstants.PARAMETER_COMMAND, KewApiConstants.INITIATE_COMMAND);
parameters.put(KFSConstants.DOCUMENT_TYPE_NAME, applicationForm.getDocTypeName());
String action = applicationForm.getDocTypeName().equals(TemConstants.TravelDocTypes.TRAVEL_CTS_CARD_DOCUMENT) ? CTS_ACTION : CORP_ACTION;
String lookupUrl = UrlFactory.parameterizeUrl(basePath +"/"+ action, parameters);
return new ActionForward(lookupUrl, true);
}
}