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.ec.batch.service.impl; 017 018 import java.util.Collection; 019 import java.util.Map; 020 021 import org.apache.commons.lang.StringUtils; 022 import org.kuali.kfs.module.ec.EffortConstants; 023 import org.kuali.kfs.module.ec.EffortKeyConstants; 024 import org.kuali.kfs.module.ec.EffortPropertyConstants; 025 import org.kuali.kfs.module.ec.batch.service.EffortCertificationCreateService; 026 import org.kuali.kfs.module.ec.businessobject.EffortCertificationDocumentBuild; 027 import org.kuali.kfs.module.ec.businessobject.EffortCertificationReportDefinition; 028 import org.kuali.kfs.module.ec.document.EffortCertificationDocument; 029 import org.kuali.kfs.module.ec.service.EffortCertificationDocumentService; 030 import org.kuali.kfs.module.ec.util.EffortCertificationParameterFinder; 031 import org.kuali.kfs.sys.KFSConstants; 032 import org.kuali.kfs.sys.KFSPropertyConstants; 033 import org.kuali.kfs.sys.MessageBuilder; 034 import org.kuali.rice.kns.service.BusinessObjectService; 035 import org.kuali.rice.kns.util.spring.Logged; 036 import org.springframework.transaction.annotation.Transactional; 037 038 /** 039 * This Process creates effort certification documents from the temporary build table created by the batch process and routes effort 040 * certification documents to project directors, fiscal officers, and central workgroups. The process includes the following steps: 041 * 042 * <li>construct an effort certification document from a temporary effort certification document; </li> 043 * <li>route each effort certification document; </li> 044 * <li>delete the temporary effort certification document after routing successfully. </li> 045 */ 046 @Transactional 047 public class EffortCertificationCreateServiceImpl implements EffortCertificationCreateService { 048 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(EffortCertificationCreateServiceImpl.class); 049 050 private BusinessObjectService businessObjectService; 051 private EffortCertificationDocumentService effortCertificationDocumentService; 052 053 /** 054 * @see org.kuali.kfs.module.ec.batch.service.EffortCertificationCreateService#create() 055 */ 056 @Logged 057 public void create() { 058 Integer fiscalYear = EffortCertificationParameterFinder.getCreateReportFiscalYear(); 059 String reportNumber = EffortCertificationParameterFinder.getCreateReportNumber(); 060 061 this.create(fiscalYear, reportNumber); 062 } 063 064 /** 065 * @see org.kuali.kfs.module.ec.batch.service.EffortCertificationCreateService#create(java.lang.Integer, java.lang.String) 066 */ 067 @Logged 068 public void create(Integer fiscalYear, String reportNumber) { 069 Map<String, String> fieldValues = EffortCertificationReportDefinition.buildKeyMap(fiscalYear, reportNumber); 070 071 String errorMessage = this.validateReportDefintion(fieldValues); 072 if (StringUtils.isNotEmpty(errorMessage)) { 073 LOG.fatal(errorMessage); 074 throw new IllegalArgumentException(errorMessage); 075 } 076 077 Collection<EffortCertificationDocumentBuild> documentsBuild = businessObjectService.findMatching(EffortCertificationDocumentBuild.class, fieldValues); 078 for (EffortCertificationDocumentBuild documentBuild : documentsBuild) { 079 boolean isCreated = effortCertificationDocumentService.createAndRouteEffortCertificationDocument(documentBuild); 080 081 if(isCreated) { 082 businessObjectService.delete(documentBuild); 083 } 084 } 085 } 086 087 /** 088 * check if a report has been defined and its docuemnts have not been generated. The combination of fiscal year and report 089 * number can determine a report definition. 090 * 091 * @param fieldValues the map containing fiscalYear and report number 092 * @return a message if a report has not been defined or its documents have been gerenated; otherwise, return null 093 */ 094 protected String validateReportDefintion(Map<String, String> fieldValues) { 095 String fiscalYear = fieldValues.get(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR); 096 String reportNumber = fieldValues.get(EffortPropertyConstants.EFFORT_CERTIFICATION_REPORT_NUMBER); 097 String combinedFieldValues = new StringBuilder(fiscalYear).append(EffortConstants.VALUE_SEPARATOR).append(reportNumber).toString(); 098 099 // Fiscal Year is required 100 if (StringUtils.isEmpty(fiscalYear)) { 101 return MessageBuilder.buildMessage(EffortKeyConstants.ERROR_FISCAL_YEAR_MISSING, null).getMessage(); 102 } 103 104 // Report Number is required 105 if (StringUtils.isEmpty(reportNumber)) { 106 return MessageBuilder.buildMessage(EffortKeyConstants.ERROR_REPORT_NUMBER_MISSING, null).getMessage(); 107 } 108 109 // check if a report has been defined 110 EffortCertificationReportDefinition reportDefinition = (EffortCertificationReportDefinition) businessObjectService.findByPrimaryKey(EffortCertificationReportDefinition.class, fieldValues); 111 if (reportDefinition == null) { 112 return MessageBuilder.buildMessage(EffortKeyConstants.ERROR_FISCAL_YEAR_OR_REPORT_NUMBER_INVALID, combinedFieldValues).getMessage(); 113 } 114 115 // check if the selected report definition is still active 116 if (!reportDefinition.isActive()) { 117 return MessageBuilder.buildMessage(EffortKeyConstants.ERROR_REPORT_DEFINITION_INACTIVE, combinedFieldValues).getMessage(); 118 } 119 120 // check if the report period of the selected report definition is open. If not, throws an error message 121 if (!KFSConstants.PeriodStatusCodes.OPEN.equals(reportDefinition.getEffortCertificationReportPeriodStatusCode())) { 122 return MessageBuilder.buildMessage(EffortKeyConstants.ERROR_REPORT_DEFINITION_PERIOD_NOT_OPENED, combinedFieldValues).getMessage(); 123 } 124 125 // check if any document has been generated for the selected report definition. If so, return with an error message 126 int countOfDocuments = businessObjectService.countMatching(EffortCertificationDocument.class, fieldValues); 127 if (countOfDocuments > 0) { 128 return MessageBuilder.buildMessageWithPlaceHolder(EffortKeyConstants.ERROR_REPORT_DOCUMENT_EXIST, reportNumber, fiscalYear).getMessage(); 129 } 130 131 // check if any document build has been generated for the selected report definition. If not, return with an error message 132 int countOfDocumentsBuild = businessObjectService.countMatching(EffortCertificationDocumentBuild.class, fieldValues); 133 if (countOfDocumentsBuild <= 0) { 134 return MessageBuilder.buildMessageWithPlaceHolder(EffortKeyConstants.ERROR_REPORT_DOCUMENT_BUILD_NOT_EXIST, reportNumber, fiscalYear).getMessage(); 135 } 136 137 return null; 138 } 139 140 /** 141 * Sets the businessObjectService attribute value. 142 * 143 * @param businessObjectService The businessObjectService to set. 144 */ 145 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 146 this.businessObjectService = businessObjectService; 147 } 148 149 /** 150 * Sets the effortCertificationDocumentService attribute value. 151 * @param effortCertificationDocumentService The effortCertificationDocumentService to set. 152 */ 153 public void setEffortCertificationDocumentService(EffortCertificationDocumentService effortCertificationDocumentService) { 154 this.effortCertificationDocumentService = effortCertificationDocumentService; 155 } 156 }