/*
* 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.bc.document.web.struts;
import java.io.ByteArrayOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
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.kuali.kfs.fp.service.FiscalYearFunctionControlService;
import org.kuali.kfs.module.bc.BCConstants;
import org.kuali.kfs.module.bc.BCKeyConstants;
import org.kuali.kfs.module.bc.document.service.BudgetRequestImportService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSConstants.ReportGeneration;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kns.util.WebUtils;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.MessageMap;
/**
* Handles Budget Construction Import Requests
*/
public class BudgetConstructionRequestImportAction extends BudgetConstructionImportExportAction {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BudgetConstructionRequestImportAction.class);
public ActionForward start(ActionMapping arg0, ActionForm arg1, HttpServletRequest arg2, HttpServletResponse arg3) throws Exception {
return arg0.findForward("import_export");
}
/**
* Imports file
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward submit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
BudgetConstructionRequestImportForm budgetConstructionImportForm = (BudgetConstructionRequestImportForm) form;
BudgetRequestImportService budgetRequestImportService = SpringContext.getBean(BudgetRequestImportService.class);
Integer budgetYear = budgetConstructionImportForm.getUniversityFiscalYear();
List<String> messageList = new ArrayList<String>();
SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MMM-yyyy ' ' HH:mm:ss", Locale.US);
boolean isValid = validateFormData(budgetConstructionImportForm);
if (!isValid) {
return mapping.findForward(BCConstants.MAPPING_IMPORT_EXPORT);
}
Person user = GlobalVariables.getUserSession().getPerson();
String principalId = user.getPrincipalId();
Date startTime = new Date();
messageList.add("Import run started " + dateFormatter.format(startTime));
messageList.add(" ");
messageList.add("Text file load phase - parsing");
List<String> parsingErrors = budgetRequestImportService.processImportFile(budgetConstructionImportForm.getFile().getInputStream(), principalId, getFieldSeparator(budgetConstructionImportForm), getTextFieldDelimiter(budgetConstructionImportForm), budgetConstructionImportForm.getFileType(), budgetYear);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (!parsingErrors.isEmpty()) {
messageList.addAll(parsingErrors);
messageList.add("Import run finished at " + dateFormatter.getCalendar().getTime().toString());
budgetRequestImportService.generatePdf(messageList, baos);
WebUtils.saveMimeOutputStreamAsFile(response, ReportGeneration.PDF_MIME_TYPE, baos, BCConstants.REQUEST_IMPORT_OUTPUT_FILE);
return null;
}
messageList.add("Text file load complete");
messageList.add(" ");
messageList.add("Validate data phase");
List<String> dataValidationErrorList = budgetRequestImportService.validateData(budgetYear, principalId);
if (!dataValidationErrorList.isEmpty()) {
messageList.add("Errors found during data validation");
messageList.addAll(dataValidationErrorList);
}
messageList.add("Validate data complete");
messageList.add(" ");
messageList.add("Update budget phase");
List<String> updateErrorMessages = budgetRequestImportService.loadBudget(user, budgetConstructionImportForm.getFileType(), budgetYear);
messageList.addAll(updateErrorMessages);
messageList.add("Update budget complete");
messageList.add(" ");
Date endTime = new Date();
messageList.add("Import run finished at " + dateFormatter.format(endTime));
budgetRequestImportService.generatePdf(messageList, baos);
WebUtils.saveMimeOutputStreamAsFile(response, ReportGeneration.PDF_MIME_TYPE, baos, BCConstants.REQUEST_IMPORT_OUTPUT_FILE);
return null;
}
/**
*
* @see org.kuali.kfs.module.bc.document.web.struts.BudgetConstructionImportExportAction#validateFormData(org.kuali.kfs.module.bc.document.web.struts.BudgetConstructionImportExportForm)
*/
@Override
public boolean validateFormData(BudgetConstructionImportExportForm form) {
boolean isValid = super.validateFormData(form);
BudgetConstructionRequestImportForm requestImportForm = (BudgetConstructionRequestImportForm) form;
MessageMap errorMap = GlobalVariables.getMessageMap();
// can't create BC documents when in system view only mode
// let the user know this up front
if (!SpringContext.getBean(FiscalYearFunctionControlService.class).isBudgetUpdateAllowed(requestImportForm.getUniversityFiscalYear())) {
errorMap.putError(KFSConstants.GLOBAL_ERRORS, BCKeyConstants.MESSAGE_BUDGET_SYSTEM_VIEW_ONLY);
isValid &= false;
}
if ( requestImportForm.getFile() == null || requestImportForm.getFile().getFileSize() == 0 ) {
errorMap.putError(KFSConstants.GLOBAL_ERRORS, BCKeyConstants.ERROR_FILE_IS_REQUIRED);
isValid = false;
}
if ( requestImportForm.getFile() != null && requestImportForm.getFile().getFileSize() == 0 ) {
errorMap.putError(KFSConstants.GLOBAL_ERRORS, BCKeyConstants.ERROR_FILE_EMPTY);
isValid = false;
}
if (requestImportForm.getFile() != null && (StringUtils.isBlank(requestImportForm.getFile().getFileName())) ) {
errorMap.putError(KFSConstants.GLOBAL_ERRORS, BCKeyConstants.ERROR_FILENAME_REQUIRED);
isValid = false;
}
//file type validation
if ( StringUtils.isBlank(requestImportForm.getFileType()) ) {
errorMap.putError(KFSConstants.GLOBAL_ERRORS, BCKeyConstants.ERROR_FILE_TYPE_IS_REQUIRED);
isValid = false;
}
return isValid;
}
}