/*
* 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.ld.document;
import java.util.Date;
import org.kuali.kfs.gl.GeneralLedgerConstants;
import org.kuali.kfs.gl.document.GeneralLedgerCorrectionProcessDocument;
import org.kuali.kfs.gl.service.OriginEntryGroupService;
import org.kuali.kfs.module.ld.batch.LaborCorrectionProcessScrubberStep;
import org.kuali.kfs.module.ld.document.service.LaborCorrectionDocumentService;
import org.kuali.kfs.module.ld.service.LaborOriginEntryGroupService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.batch.BatchSpringContext;
import org.kuali.kfs.sys.batch.Step;
import org.kuali.kfs.sys.context.ProxyUtils;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
/**
* labor Document class for the Labor Ledger Correction Process.
*/
public class LaborCorrectionDocument extends GeneralLedgerCorrectionProcessDocument {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborCorrectionDocument.class);
/**
* Constructs a LaborCorrectionDocument.java.
*/
public LaborCorrectionDocument() {
super();
}
/**
* @param change
* @see org.kuali.rice.krad.document.DocumentBase#doRouteStatusChange(org.kuali.rice.kew.clientapp.vo.DocumentRouteLevelChangeDTO)
*/
@Override
public void doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) {
// NOTE: DO NOT call the super implementation. It has the GLCP processing logic which should not be run here.
// The code below is copied from the super.super implementation:
if (getDocumentHeader().getWorkflowDocument().isCanceled()) {
getFinancialSystemDocumentHeader().setFinancialDocumentStatusCode(KFSConstants.DocumentStatusCodes.CANCELLED);
} else if (getDocumentHeader().getWorkflowDocument().isEnroute()) {
getFinancialSystemDocumentHeader().setFinancialDocumentStatusCode(KFSConstants.DocumentStatusCodes.ENROUTE);
}
if (getDocumentHeader().getWorkflowDocument().isDisapproved()) {
getFinancialSystemDocumentHeader().setFinancialDocumentStatusCode(KFSConstants.DocumentStatusCodes.DISAPPROVED);
}
if (getDocumentHeader().getWorkflowDocument().isProcessed()) {
getFinancialSystemDocumentHeader().setFinancialDocumentStatusCode(KFSConstants.DocumentStatusCodes.APPROVED);
}
if ( LOG.isInfoEnabled() ) {
LOG.info("Document: " + statusChangeEvent.getDocumentId() + " -- Status is: " + getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode());
}
// End of super.super code
if (getDocumentHeader().getWorkflowDocument().isProcessed()) {
String docId = getDocumentNumber();
if ( LOG.isInfoEnabled() ) {
LOG.info( "Document " + docId + " moving to Processed Status - starting final processing");
}
// this code is performed asynchronously
// First, save the origin entries to the origin entry table
LaborCorrectionDocumentService laborCorrectionDocumentService = SpringContext.getBean(LaborCorrectionDocumentService.class);
OriginEntryGroupService originEntryGroupService = (OriginEntryGroupService) SpringContext.getBean(LaborOriginEntryGroupService.class);
// QUESTION - since this *is* the labor correction document - why are we loading it again?
LaborCorrectionDocument doc = laborCorrectionDocumentService.findByCorrectionDocumentHeaderId(docId);
String correctionType = doc.getCorrectionTypeCode();
if (LaborCorrectionDocumentService.CORRECTION_TYPE_REMOVE_GROUP_FROM_PROCESSING.equals(correctionType)) {
String dataFileName = doc.getCorrectionInputFileName();
String doneFileName = dataFileName.replace(GeneralLedgerConstants.BatchFileSystem.EXTENSION, GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION);
originEntryGroupService.deleteFile(doneFileName);
if ( LOG.isInfoEnabled() ) {
LOG.info( "Document " + docId + " : deleted done file to remove from processing: " + doneFileName );
}
} else if (LaborCorrectionDocumentService.CORRECTION_TYPE_MANUAL.equals(correctionType)
|| LaborCorrectionDocumentService.CORRECTION_TYPE_CRITERIA.equals(correctionType)) {
synchronized ( LaborCorrectionDocumentService.class ) {
if ( !checkForExistingOutputDocument( docId ) ) {
Date today = SpringContext.getBean(DateTimeService.class).getCurrentDate();
String outputFileName = "";
if (!doc.getCorrectionFileDelete()) {
outputFileName = laborCorrectionDocumentService.createOutputFileForProcessing(docId, today);
} else {
if ( LOG.isInfoEnabled() ) {
LOG.info( "Document " + docId + " : set to delete output file - no file will be created" );
}
}
doc.setCorrectionOutputFileName(outputFileName);
if ( LOG.isInfoEnabled() ) {
LOG.info( "Document " + docId + " : about to run scrubber -- output file: " + outputFileName );
}
Step step = BatchSpringContext.getStep(LaborCorrectionProcessScrubberStep.STEP_NAME);
LaborCorrectionProcessScrubberStep correctionStep = (LaborCorrectionProcessScrubberStep) ProxyUtils.getTargetIfProxied(step);
correctionStep.setDocumentId(docId);
try {
step.execute(getClass().getName(), today);
} catch (Exception e) {
LOG.error("LLCP scrubber encountered error:", e);
throw new RuntimeException("LLCP scrubber encountered error:", e);
}
correctionStep.setDocumentId(null);
if ( LOG.isInfoEnabled() ) {
LOG.info( "Document " + docId + " : completed scrubber run -- generating reports" );
}
laborCorrectionDocumentService.generateCorrectionReport(this);
laborCorrectionDocumentService.aggregateCorrectionDocumentReports(this);
} else {
LOG.warn( "Attempt to re-process final LLCP operations for document: " + docId + " File with that document number already exists." );
}
}
} else {
LOG.error("LLCP doc " + docId + " has an unknown correction type code: " + correctionType);
}
if ( LOG.isInfoEnabled() ) {
LOG.info( "Document " + docId + " moving to Processed Status - completed final processing");
}
}
}
}