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.cg.service.impl;
017
018 import java.sql.Date;
019 import java.text.MessageFormat;
020 import java.util.Collection;
021
022 import org.apache.commons.lang.StringUtils;
023 import org.kuali.kfs.module.cg.CGConstants;
024 import org.kuali.kfs.module.cg.CGKeyConstants;
025 import org.kuali.kfs.module.cg.businessobject.Award;
026 import org.kuali.kfs.module.cg.businessobject.Proposal;
027 import org.kuali.kfs.module.cg.dataaccess.AwardDao;
028 import org.kuali.kfs.module.cg.dataaccess.CloseDao;
029 import org.kuali.kfs.module.cg.dataaccess.ProposalDao;
030 import org.kuali.kfs.module.cg.document.ProposalAwardCloseDocument;
031 import org.kuali.kfs.module.cg.service.CloseService;
032 import org.kuali.kfs.sys.context.SpringContext;
033 import org.kuali.rice.kew.exception.WorkflowException;
034 import org.kuali.rice.kns.bo.Note;
035 import org.kuali.rice.kns.service.DateTimeService;
036 import org.kuali.rice.kns.service.DocumentService;
037 import org.kuali.rice.kns.service.KualiConfigurationService;
038 import org.kuali.rice.kns.util.GlobalVariables;
039 import org.springframework.transaction.annotation.Transactional;
040
041 @Transactional
042 public class CloseServiceImpl implements CloseService {
043
044 private AwardDao awardDao;
045 private ProposalDao proposalDao;
046 private CloseDao closeDao;
047 private DateTimeService dateTimeService;
048
049 /**
050 * <ul>
051 * <li>Get the max proposal_close_number in cg_prpsl_close_t.</li>
052 * <li>Get the Close with that max_close_number.</li>got
053 * <li>If todays date is the same as the user_initiate_date on that Close, continue. Else, break.</li>
054 * <li>Get all proposals with a null closing_date and a submission_date <= the last_closed_date of the Close with the
055 * max_proposal_close number.</li>
056 * <li>Save the number of proposals that come back.</li>
057 * <li>Update each of these proposals setting the close_date to todays date.</li>
058 * <li>Get all awards with a null closing_date, an entry_date <= the last_closed_date of the Close with the max_close number
059 * and a status_code not equal to 'U'.</li>
060 * <li>Save the number of awards that come back.</li>
061 * <li>Update each of these awards setting the close_date to todays date.</li>
062 * <li>Update the Close with that max_close_number setting the proposal_closed_count to the number of proposals brought back
063 * above and the award_closed_count to the number of awards brought back above.</li>
064 * <li>Save the Close.</li>
065 * </ul>
066 *
067 * @see org.kuali.kfs.module.cg.service.CloseService#close()
068 */
069 public boolean close() {
070
071 ProposalAwardCloseDocument max = closeDao.getMaxApprovedClose();
072 Date today = dateTimeService.getCurrentSqlDateMidnight();
073
074 if (null == max) { // no closes at all. Gotta wait until we get an approved one.
075 return true;
076 }
077
078 boolean result = true;
079 String noteText = null;
080 if (StringUtils.equals(max.getDocumentHeader().getWorkflowDocument().getRouteHeader().getCurrentRouteNodeNames(),
081 CGConstants.CGKimConstants.UNPROCESSED_ROUTING_NODE_NAME)){
082
083 KualiConfigurationService kualiConfigurationService = SpringContext.getBean(KualiConfigurationService.class);
084
085 try {
086
087 Collection<Proposal> proposals = proposalDao.getProposalsToClose(max);
088 Long proposalCloseCount = new Long(proposals.size());
089 for (Proposal p : proposals) {
090 p.setProposalClosingDate(today);
091 proposalDao.save(p);
092 }
093
094 Collection<Award> awards = awardDao.getAwardsToClose(max);
095 Long awardCloseCount = new Long(awards.size());
096 for (Award a : awards) {
097 a.setAwardClosingDate(today);
098 awardDao.save(a);
099 }
100
101 max.setAwardClosedCount(awardCloseCount);
102 max.setProposalClosedCount(proposalCloseCount);
103
104 closeDao.save(max);
105 noteText = kualiConfigurationService.getPropertyString(CGKeyConstants.MESSAGE_CLOSE_JOB_SUCCEEDED);
106
107 } catch (Exception e) {
108 String messageProperty = kualiConfigurationService.getPropertyString(CGKeyConstants.ERROR_CLOSE_JOB_FAILED);
109 noteText = MessageFormat.format(messageProperty, e.getMessage(), e.getCause().getMessage());
110 } finally {
111 result = this.addDocumentNoteAfterClosing(max, noteText);
112 }
113 }
114 return result;
115 }
116
117 public ProposalAwardCloseDocument getMostRecentClose() {
118 ProposalAwardCloseDocument mostRecentClose = closeDao.getMostRecentClose();
119 return mostRecentClose;
120 }
121
122 /**
123 * @see org.kuali.kfs.module.cg.service.CloseService#addDocumentNoteAfterClosing(String)
124 */
125 protected boolean addDocumentNoteAfterClosing(ProposalAwardCloseDocument close, String noteText) {
126 Note note = new Note();
127 note.setNoteText(noteText);
128 note.setAuthorUniversalIdentifier(GlobalVariables.getUserSession().getPerson().getPrincipalId());
129
130 DocumentService service = SpringContext.getBean(DocumentService.class);
131 try {
132 service.addNoteToDocument(close, note);
133 service.approveDocument(close, note.getNoteText(), null);
134 } catch (WorkflowException we) {
135 we.printStackTrace();
136 return false;
137 }
138 return true;
139 }
140
141
142 public void setAwardDao(AwardDao awardDao) {
143 this.awardDao = awardDao;
144 }
145
146 public void setDateTimeService(DateTimeService dateTimeService) {
147 this.dateTimeService = dateTimeService;
148 }
149
150 public void setCloseDao(CloseDao closeDao) {
151 this.closeDao = closeDao;
152 }
153
154 public void setProposalDao(ProposalDao proposalDao) {
155 this.proposalDao = proposalDao;
156 }
157 }