/*
* 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.vnd.batch.service.impl;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.sys.batch.BatchInputFileType;
import org.kuali.kfs.sys.batch.service.BatchInputFileService;
import org.kuali.kfs.vnd.batch.dataaccess.DebarredVendorDao;
import org.kuali.kfs.vnd.batch.dataaccess.DebarredVendorMatchDao;
import org.kuali.kfs.vnd.batch.service.VendorExcludeService;
import org.kuali.kfs.vnd.businessobject.DebarredVendorDetail;
import org.kuali.kfs.vnd.businessobject.DebarredVendorMatch;
import org.kuali.kfs.vnd.businessobject.VendorDetail;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class VendorExcludeServiceImpl implements VendorExcludeService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(VendorExcludeServiceImpl.class);
private BatchInputFileService batchInputFileService;
private BusinessObjectService businessObjectService;
private DateTimeService dateTimeService;
private BatchInputFileType batchInputFileType;
private DebarredVendorDao debarredVendorDao;
private DebarredVendorMatchDao debarredVendorMatchDao;
/**
* @see org.kuali.kfs.vnd.batch.service.VendorExcludeService.loadEplsFile()
*/
@Override
public boolean loadEplsFile() {
// create a list of the files to process
List<String> fileNames = batchInputFileService.listInputFileNamesWithDoneFile(batchInputFileType);
String fileName = null;
long lastModified = 0;
if(fileNames.size() == 0) {
return true;
}
File tempFile;
//Consider the latest file as the files are cumulative
for (String name : fileNames) {
tempFile = new File (name);
if(tempFile.lastModified() > lastModified) {
lastModified = tempFile.lastModified();
fileName = name;
}
}
if (fileName == null) {
LOG.error("BatchInputFileService.listInputFileNamesWithDoneFile(" +
batchInputFileType.getFileTypeIdentifer() + ") returned NULL which should never happen.");
throw new RuntimeException("BatchInputFileService.listInputFileNamesWithDoneFile(" +
batchInputFileType.getFileTypeIdentifer() + ") returned NULL which should never happen.");
}
byte[] fileByteContent;
List debarredVendorList = new ArrayList<DebarredVendorDetail> ();
try {
fileByteContent = IOUtils.toByteArray(new FileInputStream(fileName));
}
catch (FileNotFoundException ex) {
LOG.error("File not found [" + fileName + "]. " + ex.getMessage());
throw new RuntimeException("File not found [" + fileName + "]. " + ex.getMessage());
}
catch (IOException ex) {
LOG.error("IO Exception loading: [" + fileName + "]. " + ex.getMessage());
throw new RuntimeException("IO Exception loading: [" + fileName + "]. " + ex.getMessage());
}
Object parsedObject = batchInputFileService.parse(batchInputFileType, fileByteContent);
debarredVendorList = (List<DebarredVendorDetail>) parsedObject;
purgeOldVendorRecords();
businessObjectService.save(debarredVendorList);
removeDoneFiles(fileNames);
return true;
}
/**
* Clears out associated .done files for the processed data files.
*/
protected void removeDoneFiles(List<String> dataFileNames) {
for (String dataFileName : dataFileNames) {
File doneFile = new File(StringUtils.substringBeforeLast(dataFileName, ".") + ".done");
if (doneFile.exists()) {
doneFile.delete();
}
}
}
/**
* @see org.kuali.kfs.vnd.batch.service.VendorExcludeService.matchVendors()
*/
@Override
public boolean matchVendors() {
List<DebarredVendorMatch> matches = debarredVendorDao.match();
businessObjectService.save(matches);
return true;
}
/**
* @see org.kuali.kfs.vnd.batch.service.VendorExcludeService.purgeOldVendorRecords()
*/
@Override
public void purgeOldVendorRecords() {
businessObjectService.deleteMatching(DebarredVendorDetail.class, new HashMap());
}
/**
* @see org.kuali.kfs.vnd.batch.service.VendorExcludeService.getDebarredVendorsUnmatched()
*/
@Override
public List<VendorDetail> getDebarredVendorsUnmatched() {
return debarredVendorMatchDao.getDebarredVendorsUnmatched();
}
/**
* @see org.kuali.kfs.vnd.batch.service.VendorExcludeService.confirmDebarredVendor()
*/
@Override
public void confirmDebarredVendor(int debarredVendorId) {
DebarredVendorMatch match = debarredVendorMatchDao.getDebarredVendor(debarredVendorId);
match.setConfirmStatusCode("C");
match.setLastUpdatedPrincipalName(GlobalVariables.getUserSession().getPerson().getPrincipalName());
match.setLastUpdatedTimeStamp(dateTimeService.getCurrentTimestamp());
businessObjectService.save(match);
}
/**
* @see org.kuali.kfs.vnd.batch.service.VendorExcludeService.denyDebarredVendor()
*/
@Override
public void denyDebarredVendor(int debarredVendorId) {
DebarredVendorMatch match = debarredVendorMatchDao.getDebarredVendor(debarredVendorId);
match.setConfirmStatusCode("D");
match.setLastUpdatedPrincipalName(GlobalVariables.getUserSession().getPerson().getPrincipalName());
match.setLastUpdatedTimeStamp(dateTimeService.getCurrentTimestamp());
businessObjectService.save(match);
}
/**
* Gets the batchInputFileService attribute.
* @return Returns the batchInputFileService.
*/
public BatchInputFileService getBatchInputFileService() {
return batchInputFileService;
}
/**
* Sets the batchInputFileService attribute value.
* @param batchInputFileService The batchInputFileService to set.
*/
public void setBatchInputFileService(BatchInputFileService batchInputFileService) {
this.batchInputFileService = batchInputFileService;
}
/**
* Gets the businessObjectService attribute.
* @return Returns the businessObjectService.
*/
public BusinessObjectService getBusinessObjectService() {
return businessObjectService;
}
/**
* Sets the businessObjectService attribute value.
* @param businessObjectService The businessObjectService to set.
*/
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
/**
* Gets the dateTimeService attribute.
* @return Returns the dateTimeService.
*/
public DateTimeService getDateTimeService() {
return dateTimeService;
}
/**
* Sets the dateTimeService attribute value.
* @param dateTimeService The dateTimeService to set.
*/
public void setDateTimeService(DateTimeService dateTimeService) {
this.dateTimeService = dateTimeService;
}
/**
* Gets the batchInputFileType attribute.
* @return Returns the batchInputFileType.
*/
public BatchInputFileType getBatchInputFileType() {
return batchInputFileType;
}
/**
* Sets the batchInputFileType attribute value.
* @param batchInputFileType The batchInputFileType to set.
*/
public void setBatchInputFileType(BatchInputFileType batchInputFileType) {
this.batchInputFileType = batchInputFileType;
}
/**
* Gets the vendorExcludeDao attribute.
* @return Returns the vendorExcludeDao.
*/
public DebarredVendorDao getDebarredVendorDao() {
return debarredVendorDao;
}
/**
* Sets the vendorExcludeDao attribute value.
* @param vendorExcludeDao The vendorExcludeDao to set.
*/
public void setDebarredVendorDao(DebarredVendorDao debarredVendorDao) {
this.debarredVendorDao = debarredVendorDao;
}
/**
* Gets the debarredVendorMatchDao attribute.
* @return Returns the debarredVendorMatchDao.
*/
public DebarredVendorMatchDao getDebarredVendorMatchDao() {
return debarredVendorMatchDao;
}
/**
* Sets the debarredVendorMatchDao attribute value.
* @param debarredVendorMatchDao The debarredVendorMatchDao to set.
*/
public void setDebarredVendorMatchDao(DebarredVendorMatchDao debarredVendorMatchDao) {
this.debarredVendorMatchDao = debarredVendorMatchDao;
}
}