View Javadoc
1   /*
2    * The Kuali Financial System, a comprehensive financial management system for higher education.
3    * 
4    * Copyright 2005-2014 The Kuali Foundation
5    * 
6    * This program is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU Affero General Public License as
8    * published by the Free Software Foundation, either version 3 of the
9    * License, or (at your option) any later version.
10   * 
11   * This program is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU Affero General Public License for more details.
15   * 
16   * You should have received a copy of the GNU Affero General Public License
17   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18   */
19  package org.kuali.kfs.module.ec.document;
20  
21  import static org.kuali.kfs.sys.fixture.UserNameFixture.khuntley;
22  
23  import java.sql.Connection;
24  import java.sql.ResultSet;
25  import java.sql.SQLException;
26  import java.sql.Statement;
27  import java.util.ArrayList;
28  import java.util.HashSet;
29  import java.util.List;
30  import java.util.Set;
31  
32  import javax.sql.DataSource;
33  
34  import org.kuali.kfs.module.ec.businessobject.EffortCertificationDetail;
35  import org.kuali.kfs.sys.ConfigureContext;
36  import org.kuali.kfs.sys.DocumentTestUtils;
37  import org.kuali.kfs.sys.context.KualiTestBase;
38  import org.kuali.kfs.sys.context.SpringContext;
39  import org.kuali.kfs.sys.service.UniversityDateService;
40  import org.kuali.rice.core.api.util.type.KualiDecimal;
41  import org.kuali.rice.kew.api.WorkflowDocument;
42  import org.kuali.rice.kim.api.identity.Person;
43  import org.kuali.rice.kim.api.identity.PersonService;
44  import org.kuali.rice.kns.service.DataDictionaryService;
45  import org.kuali.rice.krad.bo.DocumentHeader;
46  import org.kuali.rice.krad.bo.Note;
47  import org.kuali.rice.krad.document.Document;
48  import org.kuali.rice.krad.service.DocumentService;
49  import org.kuali.rice.krad.service.NoteService;
50  import org.kuali.rice.krad.service.XmlObjectSerializerService;
51  import org.kuali.rice.krad.workflow.DocumentInitiator;
52  import org.kuali.rice.krad.workflow.KualiDocumentXmlMaterializer;
53  import org.kuali.rice.krad.workflow.KualiTransactionalDocumentInformation;
54  
55  
56  @ConfigureContext(session = khuntley)
57  public class EffortCertificationRoutingTest extends KualiTestBase {
58  
59      private Set<String> databaseNodes;
60  
61      private Document getDocumentParameterFixture() throws Exception {
62          return DocumentTestUtils.createDocument(SpringContext.getBean(DocumentService.class), EffortCertificationDocument.class);
63      }
64  
65      @Override
66      public void setUp() throws Exception {
67          super.setUp();
68          String documentType = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(EffortCertificationDocument.class);
69  
70          DataSource mySource = SpringContext.getBean(DataSource.class);
71          Connection dbCon = null;
72          ResultSet dbAnswer = null;
73          databaseNodes = new HashSet<String>();
74  
75          try {
76              dbCon = mySource.getConnection();
77              Statement dbAsk = dbCon.createStatement();
78  
79              String query = "select nd.nm ";
80              query = query + "from KREW_RTE_NODE_T nd, KREW_DOC_TYP_T doc ";
81              query = query + "where nd.rte_mthd_nm is not null ";
82              query = query + "and doc.doc_typ_id = nd.doc_typ_id ";
83              query = query + "and doc.doc_typ_nm = '" + documentType + "' ";
84              query = query + "and doc.cur_ind = 1 ";
85              query = query + "and exists (select * from KREW_RTE_NODE_LNK_T ";
86              query = query + "where to_rte_node_id=nd.rte_node_id) ";
87              dbAnswer = dbAsk.executeQuery(query);
88          }
89          catch (Exception e) {
90              e.printStackTrace();
91          }
92          finally {
93              try {
94                  dbCon.close();
95              }
96              catch (SQLException sqle2) {
97                  sqle2.printStackTrace();
98              }
99          }
100         while (dbAnswer.next()) {
101             databaseNodes.add(dbAnswer.getString(1));
102         }
103     }
104 
105     private EffortCertificationDocument buildDocument() throws Exception {
106         // put accounting lines into document parameter for later
107         EffortCertificationDocument document = (EffortCertificationDocument) getDocumentParameterFixture();
108 
109         document.setEmplid("0000000060");
110         document.setEffortCertificationReportNumber("A03");
111         document.setUniversityFiscalYear(2009);// Data only exists for this year
112         document.setEffortCertificationDocumentCode(true);// for award routing
113         List<EffortCertificationDetail> effortCertificationDetailLines = new ArrayList<EffortCertificationDetail>();
114         EffortCertificationDetail testDetailLine = new EffortCertificationDetail();
115         testDetailLine.setAccountNumber("4831401");
116         testDetailLine.setChartOfAccountsCode("BL");
117         // Calculated and updated percent differ to invoke recreate routing
118         testDetailLine.setEffortCertificationCalculatedOverallPercent(40);
119         testDetailLine.setEffortCertificationUpdatedOverallPercent(50);
120         testDetailLine.setPositionNumber("1");
121         testDetailLine.setFinancialObjectCode("4000");
122         testDetailLine.setSourceChartOfAccountsCode("BL");
123         testDetailLine.setSourceAccountNumber("4831401");
124         Integer testDate = SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear();
125         testDetailLine.setUniversityFiscalYear(testDate);
126         testDetailLine.setEffortCertificationOriginalPayrollAmount(new KualiDecimal(100.00));
127         // testDetailLine.setEffortCertificationPayrollAmount(new KualiDecimal(100.00));
128         // Adding a note because duplicate documents are not permitted otherwise
129         Note testNote = new Note();
130         testNote.setNoteText("This is a nice note.");
131         testNote.setAuthorUniversalIdentifier(document.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId());
132         SpringContext.getBean(NoteService.class).createNote(testNote, document.getDocumentHeader(),document.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId() );
133         effortCertificationDetailLines.add(testDetailLine);
134         testDetailLine = new EffortCertificationDetail();
135         testDetailLine.setAccountNumber("4631483");
136         testDetailLine.setChartOfAccountsCode("BL");
137         // Calculated and updated percent differ to invoke recreate routing
138         testDetailLine.setEffortCertificationCalculatedOverallPercent(60);
139         testDetailLine.setEffortCertificationUpdatedOverallPercent(50);
140         testDetailLine.setPositionNumber("1");
141         testDetailLine.setFinancialObjectCode("4000");
142         testDetailLine.setSourceChartOfAccountsCode("BL");
143         testDetailLine.setSourceAccountNumber("4631483");
144         testDetailLine.setUniversityFiscalYear(testDate);
145         testDetailLine.setEffortCertificationOriginalPayrollAmount(new KualiDecimal(100.00));
146         effortCertificationDetailLines.add(testDetailLine);
147         document.setEffortCertificationDetailLines(effortCertificationDetailLines);
148 
149         document.getFinancialSystemDocumentHeader().setFinancialDocumentTotalAmount(new KualiDecimal(200.00));
150         SpringContext.getBean(DocumentService.class).saveDocument(document);
151         return (EffortCertificationDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(document.getDocumentNumber());
152     }
153 
154     public String serializeDocumentToXml(Document document) {
155         DocumentHeader documentHeader = document.getDocumentHeader();
156         KualiTransactionalDocumentInformation transInfo = new KualiTransactionalDocumentInformation();
157         DocumentInitiator initiatior = new DocumentInitiator();
158 
159         try {
160             String initiatorPrincipalId = documentHeader.getWorkflowDocument().getInitiatorPrincipalId();
161             Person initiatorUser = SpringContext.getBean(PersonService.class).getPersonByPrincipalName(initiatorPrincipalId);
162             initiatior.setPerson(initiatorUser);
163         }
164         catch (Exception e) {
165             throw new RuntimeException(e);
166         }
167 
168         transInfo.setDocumentInitiator(initiatior);
169         KualiDocumentXmlMaterializer xmlWrapper = new KualiDocumentXmlMaterializer();
170         xmlWrapper.setDocument(document);
171         xmlWrapper.setKualiTransactionalDocumentInformation(transInfo);
172         String xml = SpringContext.getBean(XmlObjectSerializerService.class).toXml(xmlWrapper);
173         return xml;
174     }
175 
176 
177     public final void testRouting() throws Exception {
178         EffortCertificationDocument document = buildDocument();
179         System.out.println("EffortCertificationDocument doc# " + document.getDocumentNumber());
180         WorkflowDocument testDoc = document.getDocumentHeader().getWorkflowDocument();
181         testDoc.blanketApprove("Approved by unit test");
182         assertTrue("Document didn't route!", testDoc.isProcessed() || testDoc.isFinal());
183 
184 //        List<ActionRequest> tempValues = SpringContext.getBean(ActionRequestService.class).findByRouteHeaderIdIgnoreCurrentInd(document.getDocumentHeader().getWorkflowDocument().getDocumentId());
185 //        Set<String> serviceNodes = new HashSet<String>();
186 //        for (ActionRequestValue tempValue : tempValues) {
187 //            serviceNodes.add(tempValue.getNodeInstance().getName());
188 //            System.out.println("serviceNodes:::: " + tempValue.getNodeInstance().getName());
189 //        }
190 //
191 //        boolean documentRouted = true;
192 //        for (String tempName : databaseNodes) {
193 //            System.out.println("databaseNodes::::: " + tempName);
194 //
195 //            if (serviceNodes.contains(tempName)) {
196 //            }
197 //            else {
198 //                documentRouted = false;
199 //            }
200 //        }
201 
202         // BIN: disable this test because the role is not setup for AccountingOrganazationHierachy in KIM
203         //assertTrue("Document had routing problems", documentRouted);
204         System.out.println("Document Routed");
205     }
206 }