[Ils-source] r1496 - in trunk: src/com/resolutions/ils/data webapp webapp/WEB-INF

scribe at crosswire.org scribe at crosswire.org
Thu Nov 3 16:35:44 MST 2016


Author: scribe
Date: 2016-11-03 16:35:44 -0700 (Thu, 03 Nov 2016)
New Revision: 1496

Modified:
   trunk/src/com/resolutions/ils/data/Course.java
   trunk/src/com/resolutions/ils/data/CourseAttempt.java
   trunk/src/com/resolutions/ils/data/UserProfile.java
   trunk/webapp/WEB-INF/sysconfig.properties
   trunk/webapp/admin_coursenew.jsp
   trunk/webapp/admin_curricnew.jsp
   trunk/webapp/aicc.jsp
   trunk/webapp/employee.jsp
   trunk/webapp/employeehometable.jsp
   trunk/webapp/manager_authorization.jsp
   trunk/webapp/menu.jsp
   trunk/webapp/report_employeecourseatt.jsp
   trunk/webapp/report_recurrent_training.jsp
Log:
bunch of crap to close out final bugs for 1.81


Modified: trunk/src/com/resolutions/ils/data/Course.java
===================================================================
--- trunk/src/com/resolutions/ils/data/Course.java	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/src/com/resolutions/ils/data/Course.java	2016-11-03 23:35:44 UTC (rev 1496)
@@ -2,6 +2,7 @@
 
 import org.apache.log4j.Logger;
 import org.crosswire.utils.HTTPUtils;
+import org.crosswire.xml.XMLBlock;
 import org.crosswire.data.*;
 import com.resolutions.ils.ILSSession;
 import java.util.Vector;
@@ -304,6 +305,14 @@
 		return getStringValue("COURSCERTGEN");
 	}
 
+	public boolean isCourseCertificateStore() {
+		return ("T".equals(getValue("COURSISCERTSTORE")));
+	}
+
+	public void setCourseCertificateStore(boolean val) {
+		setValue("COURSISCERTSTORE", (val) ? "T" : "F");
+	}
+
 	public String getCourseName() {
 		return getStringValue("COURSNAME");
 	}
@@ -502,6 +511,7 @@
 
 		// Default
 		String retVal = "width=800,height=600";
+/*
 		String url = getCourseURL();
 
 		if ((url != null) && (url.endsWith("frameset.htm"))) {
@@ -510,16 +520,21 @@
 			java.net.URL courseXML = null;
 			org.xml.sax.InputSource inputSource = null;
 			String expression = "/course";
+			XMLBlock courseXMLBlock = null;
 			try {
 				courseXML = new java.net.URL(url);
+				courseXMLBlock = XMLBlock.loadXMLBlock(courseXML.openStream());
+logger.info("courseXML: " + courseXMLBlock);
 				inputSource = new org.xml.sax.InputSource(courseXML.openStream());
 			}
 			catch (Exception ex) {
 //				logger.error(ex, ex);
 			}
-			if (inputSource == null) {
+			if (courseXMLBlock == null) {
 				try {
 					File f = new File(context.getRealPath(url));
+					courseXMLBlock = XMLBlock.loadXMLBlock(new java.io.FileInputStream(f));
+logger.info("courseXML: " + courseXMLBlock);
 					inputSource = new org.xml.sax.InputSource(new java.io.FileInputStream(f));
 				}
 				catch (Exception ex) {
@@ -545,6 +560,7 @@
 				logger.error("Bad course URL: " + url);
 			}
 		}
+*/
 		return retVal;
 	}
 

Modified: trunk/src/com/resolutions/ils/data/CourseAttempt.java
===================================================================
--- trunk/src/com/resolutions/ils/data/CourseAttempt.java	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/src/com/resolutions/ils/data/CourseAttempt.java	2016-11-03 23:35:44 UTC (rev 1496)
@@ -363,14 +363,18 @@
 	public void passAllAssociatedCurriculum(ILSSession session, HttpServletRequest request, String forcePassReason) {
 		Collection<Course> curs = Course.getUserCurricula(session, getCourseAttemptUserProfileID());
 		if (curs != null) {
+			// find all curricula our user is assigned and check each one
 			for (Course cur : curs) {
+
 				boolean isPassed = false;
 				Vector<Course> courses = cur.getCurriculumCourses();
 				if (courses != null) {
-					// is this course a member of the curriculum?
+					// is this course a member of the tested curriculum?
+					boolean isPertinent = false;
 					for (Course c : courses) {
 						if (c.getCourseID() == getCourseAttemptCourseID()) {
-							isPassed = true;
+							isPertinent = true;
+logger.info("curr is pertinent: " + cur.getCourseName());
 							break;
 						}
 					}
@@ -381,7 +385,7 @@
 					int  score       = 0;
 					int  courseCount = 0;
 
-					if (isPassed) {
+					if (isPertinent) {
 						for (Course c : courses) {
 							isPassed = false;
 
@@ -394,13 +398,15 @@
 									d = ca.getCourseAttemptCompleteDate();
 									endDate = (d != null && (endDate == 0 || endDate < d.getTime())) ? d.getTime() : endDate;
 
-									if (ca.getCourseAttemptStatusID() == STATUS_PASSED) {
+									boolean finished = !c.isCourseRequiresManagerApproval() || ca.isCourseAttemptManagerApproved();
+									if (finished && ca.getCourseAttemptStatusID() == STATUS_PASSED) {
 										int s = ca.getCourseAttemptScore();
 										if (s > -1) {
 											++courseCount;
 											score += s;
 										}
 										isPassed = true;
+logger.info("course is passed: " + c.getCourseName());
 										break;
 									}
 								}
@@ -412,7 +418,7 @@
 					}
 					// if we have a curriculum of which our course is a member and all courses in this curriculum are passed,
 					// then create a passed course attempt for this curriculum
-					if (isPassed) {
+					if (isPertinent && isPassed) {
 
 						if (courseCount != 0) score /= courseCount;
 
@@ -429,10 +435,10 @@
 						// TODO: timeframe?
 
 						ca = ca.saveNew(session);
+logger.info("passing curriulum: " + cur.getCourseName());
 
 						// render certificate
-						String certgen = cur.getCourseCertificateGenerator();
-						if (certgen != null && certgen.trim().length() > 0) {
+						if (cur.isCourseCertificateStore()) {
 							try {
 								ca.saveCertificate(ca.generateCertificate(session, request));
 							}
@@ -981,8 +987,7 @@
 
 			ca.sendStatusUpdateEvent(httpRequest.getSession().getServletContext());
 
-			String certgen = course.getCourseCertificateGenerator();
-			if (certgen != null && certgen.trim().length() > 0) {
+			if (course.isCourseCertificateStore()) {
 				try {
 					ca.saveCertificate(ca.generateCertificate(ilsSession, httpRequest));
 				}
@@ -997,16 +1002,22 @@
 		if (allCurriculumCourses && course.isCourseCurriculum()) {
 			for (Course curCourse : course.getCurriculumCourses()) {
 				Vector<CourseAttempt> cas = CourseAttempt.getUserCourseAttempts(ilsSession, userProfileID, curCourse.getCourseID(), false);
+				int caid = -1;
 				boolean skipCourse = false;
 				if (cas != null) {
 					for (CourseAttempt ca2 : cas) {
-						if (ca2.getCourseAttemptStatusID() == STATUS_PASSED && !ca2.isCourseAttemptExpired()) {
-							skipCourse = true;
+						if (!ca2.isCourseAttemptExpired()) {
+							if (ca2.getCourseAttemptStatusID() == STATUS_PASSED) {
+								skipCourse = true;
+							}
+							else {
+								caid = ca2.getCourseAttemptID();
+							}
 						}
 					}
 				}
 				if (!skipCourse) {
-					CourseAttempt.forcePass(curCourse.getCourseID(), userProfileID, reason, ilsSession, httpRequest, allCurriculumCourses, -1);
+					CourseAttempt.forcePass(curCourse.getCourseID(), userProfileID, reason, ilsSession, httpRequest, allCurriculumCourses, caid);
 				}
 			}
 		}

Modified: trunk/src/com/resolutions/ils/data/UserProfile.java
===================================================================
--- trunk/src/com/resolutions/ils/data/UserProfile.java	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/src/com/resolutions/ils/data/UserProfile.java	2016-11-03 23:35:44 UTC (rev 1496)
@@ -80,10 +80,21 @@
 	static String COUNTWOULDBEDELETES = "SELECT COUNT(*) WOULDBE FROM ("+SELECTOLDIDS+") TMPTABLE";
 	static String LOOKUPUSERGROUPS = "SELECT * FROM ILSGROUP T1, USERGROUP T2 WHERE T1.ILSGROUPID=T2.ILSGROUPID AND T2.USERPRID={USERPRID} AND T1.COMPANYID={COMPANYID} AND T2.COMPANYID={COMPANYID}";
 
-	static String RECURRENT_TRAINING_REPORT = "SELECT DISTINCT CASS.COMPANYID, CASS.USERPRID, CASS.COURSID, UP.USERPRLNAME, UP.USERPRFNAME, UP.USERPRNUM, "
+	static String RECURRENT_TRAINING_REPORT = "SELECT DISTINCT CASS.COMPANYID, CASS.USERPRID, CASS.COURSID, "
+		+ " CASS.FROMCURRICULUM,  CURDET.COURSISCURRICCERT, "
+		+ " UP.USERPRLNAME, UP.USERPRFNAME, UP.USERPRNUM, "
 		+ " (SELECT MAX(GROUPNAME) FROM USERGROUP UG JOIN ILSGROUP IG ON UG.ILSGROUPID=IG.ILSGROUPID AND UG.USERPRID=UP.USERPRID AND GROUPTYPEID=2) WORKGROUP," 
 		+ " (SELECT MAX(GROUPNAME) FROM USERGROUP UG JOIN ILSGROUP IG ON UG.ILSGROUPID=IG.ILSGROUPID AND UG.USERPRID=UP.USERPRID AND GROUPTYPEID=1) ROLE, "
-		+ "C.COURSNAME, CA.CACOMPLETEDATE, CASE C.COURSPASSEXPDAYS WHEN 0 THEN CA.CAEXPIREDON ELSE COALESCE(CA.CAEXPIREDON, CA.CACOMPLETEDATE+C.COURSPASSEXPDAYS) END AS CAEXPIREDON, DATEDIFF(day, CA.CAEXPIREDON, CURRENT_TIMESTAMP) as DAYSEXPIRED, CASE C.COURSPASSEXPDAYS WHEN 0 THEN NULL ELSE C.COURSPASSEXPDAYS - DATEDIFF(day, CA.CACOMPLETEDATE, CURRENT_TIMESTAMP) END as DAYSSHOULDEXPIRE from USERCOURSEASSIGNMENTSWITHGROUPS CASS LEFT JOIN COURSE C ON C.COURSID = CASS.COURSID LEFT JOIN COURSEATTEMPT CA ON CA.USERPRID=CASS.USERPRID AND CA.COURSID=CASS.COURSID INNER JOIN (SELECT USERPRID, COURSID, MAX(CACOMPLETEDATE) as max_date FROM COURSEATTEMPT GROUP BY USERPRID, COURSID)a on a.USERPRID = CA.USERPRID AND a.COURSID=CA.COURSID and a.max_date = CA.CACOMPLETEDATE LEFT JOIN USERPROFILE UP ON UP.COMPANYID=CASS.COMPANYID AND UP.USERPRID = CASS.USERPRID WHERE CASS.COMPANYID={COMPANYID} AND (DATEDIFF(day, CA.CAEXPIREDON, CURRENT_TIMESTAMP) >= 0 OR CASE C.COURSPASSEXPDAYS WHEN 0 THEN NULL ELSE C.COURSPASSEXPDAYS - DATEDIFF(day, CA.CACOMPLETEDATE, CURRENT_TIMESTAMP) END <={DAYSTILEXP}) AND UP.USERPRSTATUSID=" + STATUS_ACTIVE;
+		+ " C.COURSNAME, CA.CACOMPLETEDATE, CASE C.COURSPASSEXPDAYS WHEN 0 THEN CA.CAEXPIREDON ELSE COALESCE(CA.CAEXPIREDON, CA.CACOMPLETEDATE+C.COURSPASSEXPDAYS) END AS CAEXPIREDON, DATEDIFF(day, CA.CAEXPIREDON, CURRENT_TIMESTAMP) as DAYSEXPIRED, CASE C.COURSPASSEXPDAYS WHEN 0 THEN NULL ELSE C.COURSPASSEXPDAYS - DATEDIFF(day, CA.CACOMPLETEDATE, CURRENT_TIMESTAMP) END as DAYSSHOULDEXPIRE "
+		+ " FROM USERCOURSEASSIGNMENTSWITHGROUPS CASS "
+		+ " LEFT JOIN COURSE C ON C.COURSID = CASS.COURSID "
+		+ " LEFT JOIN COURSE CURDET ON CURDET.COURSID = CASS.FROMCURRICULUM "
+		+ " LEFT JOIN COURSEATTEMPT CA ON CA.USERPRID=CASS.USERPRID AND CA.COURSID=CASS.COURSID "
+		+ " INNER JOIN (SELECT USERPRID, COURSID, MAX(CACOMPLETEDATE) as max_date FROM COURSEATTEMPT GROUP BY USERPRID, COURSID)a on a.USERPRID = CA.USERPRID AND a.COURSID=CA.COURSID and a.max_date = CA.CACOMPLETEDATE "
+		+ " LEFT JOIN USERPROFILE UP ON UP.COMPANYID=CASS.COMPANYID AND UP.USERPRID = CASS.USERPRID "
+		+ " WHERE CASS.COMPANYID={COMPANYID} AND (DATEDIFF(day, CA.CAEXPIREDON, CURRENT_TIMESTAMP) >= 0 OR CASE C.COURSPASSEXPDAYS WHEN 0 THEN NULL ELSE C.COURSPASSEXPDAYS - DATEDIFF(day, CA.CACOMPLETEDATE, CURRENT_TIMESTAMP) END <={DAYSTILEXP}) AND UP.USERPRSTATUSID=" + STATUS_ACTIVE
+		+ " AND (CURDET.COURSISCURRICCERT IS NULL OR CURDET.COURSISCURRICCERT = 'F')"
+		+ "";
 static String RECURRENT_TRAINING_REPORT_LIMIT_TO_MANAGER = " AND CASS.USERPRID IN (SELECT DISTINCT UG.USERPRID FROM MANAGERGROUP MG LEFT JOIN USERGROUP UG ON UG.COMPANYID = MG.COMPANYID AND UG.ILSGROUPID=MG.ILSGROUPID WHERE MG.COMPANYID={COMPANYID} AND MG.USERPRID={USERPRID}) AND (GROUPTYPEID <> 2 OR ILSGROUPID IN (SELECT ILSGROUPID FROM MANAGERGROUP WHERE COMPANYID={COMPANYID} AND USERPRID={USERPRID}))";
 
 
@@ -174,7 +185,7 @@
         	}
         	if (modCols.contains("USERPRPASSWD")) {
         		eventsLogger.info("User: " + getUserProfileNum() + " PASSWORD changed " + "by user: " + session.getCurrentUserProfile().getUserProfileNum());
-        		if (email != null) {
+			if (email != null && getUserProfileStatusID() == STATUS_ACTIVE) {
 	    			try {
 						String subject = Utils.getSysConfig(email).getProperty("EmailTemplate1Subject");
 						String body    = Utils.getSysConfig(email).getProperty("EmailTemplate1Body");
@@ -223,7 +234,7 @@
     			try {
     				Properties sysConfig = Utils.getSysConfig(email);
 				    boolean emailNotice = "on".equals(sysConfig.getProperty("EmailEnableWelcome", "off"));
-				    if (emailNotice) {
+				    if (emailNotice && getUserProfileStatusID() == STATUS_ACTIVE) {
 						String subject = sysConfig.getProperty("EmailTemplate6Subject");
 						String body    = sysConfig.getProperty("EmailTemplate6Body");
 						HashMap<String, Object> params = new HashMap<String, Object>();
@@ -422,7 +433,7 @@
 
 		UserProfile retVal = new UserProfile();
 
-		String sql = "SELECT * FROM USERPROFILE UP WHERE UP.COMPANYID={COMPANYID} AND EXISTS (SELECT USERPRID FROM MANAGERGROUP MG WHERE MG.USERPRID=UP.USERPRID AND MG.COMPANYID={COMPANYID})";
+		String sql = "SELECT * FROM USERPROFILE UP WHERE UP.COMPANYID={COMPANYID} AND EXISTS (SELECT USERPRID FROM MANAGERGROUP MG WHERE MG.USERPRID=UP.USERPRID AND MG.COMPANYID={COMPANYID}) AND UP.USERPRSTATUSID=" + STATUS_ACTIVE;
 		retVal.setCompanyID(companyID);
 
 		if (excludeRecurEmailOverrides) {
@@ -558,7 +569,7 @@
 	}
 
     public UserProfile []getManagers() {
-        String sql = LOOKUP + " AND USERPRID IN (" + LOOKUPMANAGERS + ")";
+        String sql = LOOKUP + " AND USERPRID IN (" + LOOKUPMANAGERS + ") AND USERPRSTATUSID=" + STATUS_ACTIVE;
         Vector<UserProfile> rows = this.getDataSet(sql);
         return rows.toArray(new UserProfile[0]);
     }

Modified: trunk/webapp/WEB-INF/sysconfig.properties
===================================================================
--- trunk/webapp/WEB-INF/sysconfig.properties	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/WEB-INF/sysconfig.properties	2016-11-03 23:35:44 UTC (rev 1496)
@@ -52,3 +52,6 @@
 Docusign.integratorKey=SSIX-55285494-f60e-49a6-bb5c-70c8605fbee4
 Docusign.accountID=f1f63527-3250-49c8-b31b-3166cb3e6a46
 DefaultPasswd=changeme
+Add alternate certificate generators here
+#CertificateGeneratorCourse.1=certificate_alt.jsp|Alternate Course Certificate
+#CertificateGeneratorCurriculum.1=certificate_curriculum_alt.jsp|Alternate Curriculum Certificate

Modified: trunk/webapp/admin_coursenew.jsp
===================================================================
--- trunk/webapp/admin_coursenew.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/admin_coursenew.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -146,6 +146,9 @@
               else if ("certgen".equals(fi.getFieldName())) {
                   if (fi.getString() != null) try { current.setCourseCertificateGenerator(fi.getString()); } catch (Exception e) { logger.error(e); }
                 }
+              else if ("certstore".equals(fi.getFieldName())) {
+		if (fi.getString() != null) try { current.setCourseCertificateStore(Integer.parseInt(fi.getString())>0); } catch (Exception e) { logger.error(e); }
+                }
               else if ("passexp".equals(fi.getFieldName())) {
                   if (fi.getString() != null) try { current.setCoursePassExpireDays(Integer.parseInt(fi.getString())); } catch (Exception e) { logger.error(e); }
                 }
@@ -399,8 +402,34 @@
                         <td><input name="pass" type="text" value="<%=current.getCoursePass()%>" size="6"/> % </td>
                       </tr>
                       <tr>
+                        <td class="formHeadings">Course Certificate</td>
+                        <td>
+                              <input id="dontStoreCert" name="certstore" type="radio" <%=!current.isCourseCertificateStore()?"checked=\"true\"":""%> value="0" />
+				<label for="dontStoreCert">Displays Current Template and Data</label>
+                              <input id="storeCert" name="certstore" type="radio" <%=current.isCourseCertificateStore()?"checked=\"true\"":""%> value="1" />
+				<label for="storeCert">Imaged At Time of Completion</label>
+			</td>
+                      </tr>
+                      <tr>
                         <td class="formHeadings">Course Certificate Generator </td>
-                        <td><input name="certgen" style="width:100%" type="text" placeholder="default or certificate.jsp or certificate_curriculum.jsp" value="<%=current.getCourseCertificateGenerator()%>" size="40"/></td>
+                        <td>
+				<select name="certgen">
+					<option value="">default</option>
+<%
+				for (int i = 1; true; ++i) {
+					String gen = Utils.getSysConfig(session).getProperty("CertificateGeneratorCourse."+i);
+					if (gen == null) break;
+
+					String genPage = gen.split("\\|")[0];
+					String genName = gen.split("\\|")[1];
+%>
+					<option value="<%=genPage%>"<%=genPage.equals(current.getCourseCertificateGenerator())?" selected=\"selected\"":""%> size="40"/><%=genName%></option>
+<%
+				}
+%>
+			
+				</select>
+			</td>
                       </tr>
                       <tr>
                         <td class="formHeadings">Course Certificate Expires After </td>
@@ -524,7 +553,7 @@
                         <td>
                           <table class="tableData">
                             <tr>
-                              <th><input type="checkbox" name="cba1" onClick="checkAll('roleck', this.checked);"></th>
+                              <th><input type="checkbox" name="cba1" onClick="checkAll('roleck', this.checked);" /></th>
                               <th><a href="admin_coursenew.jsp?courseid=<%=courseID%>&sort=name"><t:t>role name</t:t></a></th>
                               <th><a href="admin_coursenew.jsp?courseid=<%=courseID%>&sort=desc">description</a></th>
                             </tr>
@@ -534,7 +563,7 @@
           boolean checked = (inCourse.contains(new Integer(role.getGroupID())));
 %>
                             <tr>
-                              <td><input id="roleck<%=i%>" type="checkbox" <%=(checked)?"checked=\"true\"":""%> name="roleid" value="<%=role.getGroupID()%>"></td>
+                              <td><input id="roleck<%=i%>" type="checkbox" <%=(checked)?"checked=\"true\"":""%> name="roleid" value="<%=role.getGroupID()%>" /></td>
                               <td><%=role.getGroupName()%></td>
                               <td><%=role.getGroupDesc()%></td>
                             </tr>

Modified: trunk/webapp/admin_curricnew.jsp
===================================================================
--- trunk/webapp/admin_curricnew.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/admin_curricnew.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -76,6 +76,8 @@
         if (val != null) current.setCourseDesc(val);
         val = request.getParameter("certgen");
   	if (val != null) current.setCourseCertificateGenerator(val);
+        val = request.getParameter("certstore");
+  	if (val != null) try { current.setCourseCertificateStore(Integer.parseInt(val)>0); } catch (Exception e) { logger.error(e); }
         val = request.getParameter("passexp");
 	if (val != null) try { current.setCoursePassExpireDays(Integer.parseInt(val)); } catch (Exception e) { logger.error(e); }
         val = request.getParameter("passreassign");
@@ -144,9 +146,10 @@
 <head>
   <title><%= ilsSession.getCurrentCompany().getCompanyName() %> eLearning Portal</title>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-  <script type="text/javascript" src="crosswire.js"></script>
-  <link href="lms_style.css" rel="stylesheet" type="text/css">
-  <script type="text/javascript" language="JavaScript">
+	<script type="text/javascript" src="crosswire.js"></script>
+	<script type="text/javascript" src="js/jquery/jquery.min.js"></script>
+	<link href="lms_style.css" rel="stylesheet" type="text/css">
+	<script type="text/javascript" language="JavaScript">
 <!--
 function confirmRevoke() {
     if (confirm("Running this routine will assign this curriculum as recurrent training to all applicable users.  Are you sure?")) {
@@ -160,6 +163,17 @@
 function rC(val) {
     document.coursesave.locURL.value = 'courses/'+val+'/frameset.htm';
 }
+function updateCertVisibility() {
+	var hide = !$('#curricCert').is(':checked');
+	$('#dontStoreCert').prop('disabled', hide);
+	$('#storeCert').prop('disabled', hide);
+	$('#certgen').prop('disabled', hide);
+}
+
+$(document).ready(function() {
+	updateCertVisibility();
+});
+
 // -->
   </script>
 
@@ -215,11 +229,37 @@
                             </tr>
                             <tr>
                               <td class="formHeadings">Enable Curriculum Certificate :</td>
-                              <td><input type="checkbox" <%=(current.isCourseCurriculumCertificate())?"checked=\"checked\"":""%> name="curricCert" value="true" /></td>
+                              <td><input onclick="updateCertVisibility();" type="checkbox" <%=(current.isCourseCurriculumCertificate())?"checked=\"checked\"":""%> id="curricCert" name="curricCert" value="true" /></td>
                             </tr>
 			      <tr>
+                        <td class="formHeadings">Curriculum Certificate</td>
+                        <td>
+                              <input id="dontStoreCert" name="certstore" type="radio" <%=!current.isCourseCertificateStore()?"checked=\"true\"":""%> value="0" />
+				<label for="dontStoreCert">Displays Current Template and Data</label>
+                              <input id="storeCert" name="certstore" type="radio" <%=current.isCourseCertificateStore()?"checked=\"true\"":""%> value="1" />
+				<label for="storeCert">Imaged At Time of Completion</label>
+			</td>
+                      </tr>
+                      <tr>
 				<td class="formHeadings">Curriculum Certificate Generator </td>
-				<td><input name="certgen" style="width:100%" type="text" placeholder="default or certificate.jsp or certificate_curriculum.jsp" value="<%=current.getCourseCertificateGenerator()%>" size="40"/></td>
+				<td>
+					<select id="certgen" name="certgen">
+						<option value="">default</option>
+<%
+					for (int i = 1; true; ++i) {
+						String gen = Utils.getSysConfig(session).getProperty("CertificateGeneratorCurriculum."+i);
+						if (gen == null) break;
+
+						String genPage = gen.split("\\|")[0];
+						String genName = gen.split("\\|")[1];
+%>
+						<option value="<%=genPage%>"<%=genPage.equals(current.getCourseCertificateGenerator())?" selected=\"selected\"":""%> size="40"/><%=genName%></option>
+<%
+					}
+%>
+				
+					</select>
+				</td>
 			      </tr>
                             <tr>
                               <td class="formHeadings">Enable Curriculum Part Retake :</td>

Modified: trunk/webapp/aicc.jsp
===================================================================
--- trunk/webapp/aicc.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/aicc.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -242,9 +242,9 @@
 				ca.setCourseAttemptCompleteDate(new Date());
 				ca.save(orig);
 				if (ca.getCourseAttemptStatusID() != originalStatusID) {
-					if (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED) {
-						String certgen = course.getCourseCertificateGenerator();
-						if (certgen != null && certgen.trim().length() > 0) {
+					boolean finished = !((course.isCourseRequiresManagerApproval()) && (!ca.isCourseAttemptManagerApproved()));
+					if (finished && ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED) {
+						if (course.isCourseCertificateStore()) {
 							try {
 								ca.saveCertificate(ca.generateCertificate(ilsSession, request));
 							}

Modified: trunk/webapp/employee.jsp
===================================================================
--- trunk/webapp/employee.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/employee.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -153,8 +153,10 @@
           <td width="10%">
 <%
 	if (curricCompleted) {
-            out.append("<a href=\"#\" onClick=\"showWindow('certificate_curriculum.jsp?c=" + c.getCourseID() + "'); return false;\">");
-            out.append("<img src=\"images/print_certficate.png\" border=\"0\" alt=\"Certificate\" width=\"21\" height=\"20\"/>           </a>");
+		String generator = c.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate_curriculum..jsp";
+		out.append("<a href=\"#\" onClick=\"showWindow('"+generator+"?c=" + c.getCourseID() + "'); return false;\">");
+		out.append("<img src=\"images/print_certficate.png\" border=\"0\" alt=\"Certificate\" width=\"21\" height=\"20\"/>           </a>");
 	}
 %>
           </td>
@@ -338,8 +340,10 @@
           <td class="centered">
 <%
         if (finished) {
+		String generator = cc.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate.jsp";
 %>
-            <a href="#" onClick="showWindow('certificate.jsp?ca=<%=ca.getCourseAttemptID()%>'); return false;">
+            <a href="#" onClick="showWindow('<%=generator%>?ca=<%=ca.getCourseAttemptID()%>'); return false;">
               <img src="images/print_certficate.png" border="0" alt="Certificate" width="21" height="20"/>   </a>
 <%
         }
@@ -586,9 +590,11 @@
         out.append("</a></td>");
         out.append("<td class=\"centered\">");
         if (finished && !supressCerts) {
-            out.append("<a href=\"#\" onClick=\"showWindow('certificate.jsp?ca=" + ca.getCourseAttemptID() + "'); return false;\">");
-            out.append("<img src=\"images/print_certficate.png\" border=\"0\" alt=\"Certificate\" width=\"21\" height=\"20\"/>           </a>");
-        }
+		String generator = cc.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate.jsp";
+		out.append("<a href=\"#\" onClick=\"showWindow('"+generator+"?ca=" + ca.getCourseAttemptID() + "'); return false;\">");
+		out.append("<img src=\"images/print_certficate.png\" border=\"0\" alt=\"Certificate\" width=\"21\" height=\"20\"/>           </a>");
+	}
         out.append("</td>");
         out.append("<td> " + score + " </td>");
         out.append("</tr>");

Modified: trunk/webapp/employeehometable.jsp
===================================================================
--- trunk/webapp/employeehometable.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/employeehometable.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -219,8 +219,10 @@
           <td class="centered">
 <%
         if (finished) {
+		String generator = cc.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate.jsp";
 %>
-            <a href="#" onClick="showWindow('certificate.jsp?ca=<%=ca.getCourseAttemptID()%>'); return false;">
+            <a href="#" onClick="showWindow('<%=generator%>?ca=<%=ca.getCourseAttemptID()%>'); return false;">
                 <img src="images/print_certficate.png" border="0" alt="Certificate" width="21" height="20"/>           </a>
 <%
         }
@@ -344,8 +346,10 @@
           <td class="centered">
 <%
         if (finished) {
+		String generator = cc.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate.jsp";
 %>
-            <a href="#" onClick="showWindow('certificate.jsp?ca=<%=ca.getCourseAttemptID()%>'); return false;">
+            <a href="#" onClick="showWindow('<%=generator%>?ca=<%=ca.getCourseAttemptID()%>'); return false;">
               <img src="images/print_certficate.png" border="0" alt="Certificate" width="21" height="20"/>   </a>
 <%
         }

Modified: trunk/webapp/manager_authorization.jsp
===================================================================
--- trunk/webapp/manager_authorization.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/manager_authorization.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -14,6 +14,7 @@
 
 
 <%
+	Logger logger = Logger.getLogger("report/manager/approval");
     String statusMsg = "";
     String validError = "";
     String action = request.getParameter("action");
@@ -40,8 +41,18 @@
             for (int i = 0; i < caids.length; i++) {
                 CourseAttempt ca = CourseAttempt.getCourseAttempt(ilsSession, Integer.parseInt(caids[i]));
                 CourseAttempt orig = (CourseAttempt)ca.clone();
+                Course c = Course.getCourse(ilsSession, ca.getCourseAttemptCourseID());
                 ca.setCourseAttemptManagerApproved(true);
                 ca.save(orig);
+		if (c.isCourseCertificateStore()) {
+			try {
+				ca.saveCertificate(ca.generateCertificate(ilsSession, request));
+			}
+			catch (Exception e) {
+				logger.error(e, e);
+			}
+		}
+		ca.passAllAssociatedCurriculum(ilsSession, request);
             }
         }
         statusMsg = "" + caids.length + " course" + ((caids.length != 1) ? "s have" : " has") + " been approved.";

Modified: trunk/webapp/menu.jsp
===================================================================
--- trunk/webapp/menu.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/menu.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -31,6 +31,8 @@
     }
 </style>
 
+	<form name="report_recurrent_training" action="report_recurrent_training.jsp" style="display:none;"></form>
+
    <div id="Banner"><span class="loggedinBar">Logged in as:<%=user.getUserProfileNum()%></span></div>
       <div id="MainMenu">
 <%
@@ -87,7 +89,7 @@
   }
   if ((user.getUserProfileAccessLevel() > UserProfile.ACCESS_MANAGER) || (user.hasAccess(UserProfile.ACCESS_MODE_MENU_STUDENT_RECORDS))) {
 %>
-	  <li><a href="report_recurrent_training.jsp">Recurrent Training Report</a></li>
+	  <li><a href="#" onclick="$.blockUI({ message: '<h3><img width=&quot;30&quot; height=&quot;30&quot; style=&quot;margin-right:10px;vertical-align:middle;&quot; src=&quot;images/loading.gif&quot;/> Generating Report...</h3>' }); document.report_recurrent_training.submit();return false;">Recurrent Training Report</a></li>
 <%
   }
   if (user.getUserProfileAccessLevel() >= UserProfile.ACCESS_MANAGER) {

Modified: trunk/webapp/report_employeecourseatt.jsp
===================================================================
--- trunk/webapp/report_employeecourseatt.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/report_employeecourseatt.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -20,7 +20,7 @@
 
 <%!
 	static SimpleDateFormat df  = new SimpleDateFormat("MM/dd/yyyy");
-	Logger logger = Logger.getLogger(this.getClass());
+	static Logger logger = Logger.getLogger("report/employee/course/attempt");
 %>
 <%
     ILSSession ilsSession = (ILSSession)session.getAttribute("ilsSession");
@@ -109,7 +109,7 @@
 		HashSet<CourseAttempt> meCourseAttempts = new HashSet<CourseAttempt>();
 		courseCourseAttempts.put(mainCourse.getCourseID(), meCourseAttempts);
 		logger.debug("processing course: " + mainCourse.getCourseName());
-		Vector cas        = CourseAttempt.getUserCourseAttempts(ilsSession, current.getUserProfileID(), mainCourse.getCourseID());
+		Vector cas = CourseAttempt.getUserCourseAttempts(ilsSession, current.getUserProfileID(), mainCourse.getCourseID());
 		boolean nonExpired = false;
 		for (int i = 0; i < cas.size() + 1; i++) {
 			CourseAttempt ca  = null;
@@ -119,6 +119,7 @@
 				else {
 					ca = new CourseAttempt();
 					ca.setCourseAttemptID(-1);
+					ca.setIntValue("COMPANYID", ilsSession.getCompanyID());
 				}
 			}
 			else {
@@ -161,7 +162,7 @@
 			ca.setValue("coursename", mainCourse.getCourseName());
 			ca.setValue("seattimetext", mainCourse.getCourseSeatTimeText());
 			ca.setCourseAttemptCourseID(mainCourse.getCourseID());
-			if (mainCourse.isCourseActive() || (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_FAILED) || (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED)) {
+			if (mainCourse.isCourseActive() || (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_FAILED) || (finished && ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED)) {
 				courseAttempts.add(ca);
 				meCourseAttempts.add(ca);
 			}
@@ -203,8 +204,11 @@
 		cursor: pointer;
 	}
 </style>
-<script type="text/javascript" src="crosswire.js"></script>
-<script type="text/javascript" src="js/jquery/jquery.min.js"></script>
+
+	<script type="text/javascript" src="crosswire.js"></script>
+	<script type="text/javascript" src="js/jquery/jquery.min.js"></script>
+	<script type="text/javascript" src="js/jquery/jquery.blockUI.js"></script>
+
 <script type="text/javascript">
 var rcid=0;
 function retake(inCID) {
@@ -213,6 +217,7 @@
 }
 
 function retakeComplete(resultObject) {
+	$.blockUI({ message: '<h3><img width=&quot;30&quot; height=&quot;30&quot; style=&quot;margin-right:10px;vertical-align:middle;&quot; src=&quot;images/loading.gif&quot;/> Generating Report...</h3>' });
 	reason = resultObject.value;
 	document.getElementById('revokeCID').value=rcid;
 	if (reason.length > 0) reason = reason + ' / ';
@@ -229,6 +234,7 @@
 }
 
 function forcePassComplete(resultObject) {
+	$.blockUI({ message: '<h3><img width=&quot;30&quot; height=&quot;30&quot; style=&quot;margin-right:10px;vertical-align:middle;&quot; src=&quot;images/loading.gif&quot;/> Generating Report...</h3>' });
 	reason = resultObject.value;
 	document.getElementById('passCID').value=pcid;
 	document.getElementById('passCourseID').value=pcourseid;
@@ -464,9 +470,10 @@
 		int  passedCourseCount = (Integer)values.get("passedCourseCount");
 		int  totalCourseCount  = (Integer)values.get("totalCourseCount");
 		ca.setValue("seattimetext", Course.getNiceTimeText(timeFrame));
+		boolean finished = !((curr.isCourseRequiresManagerApproval()) && (!ca.isCourseAttemptManagerApproved()));
 		// if we have a stored history of passed or failed, use it.  Otherwise, compute curriculum status based on course progress
 		if (
-			   ca.getCourseAttemptStatusID() != CourseAttempt.STATUS_PASSED
+			   (!finished || ca.getCourseAttemptStatusID() != CourseAttempt.STATUS_PASSED)
 			&& ca.getCourseAttemptStatusID() != CourseAttempt.STATUS_FAILED
 		) {
 			ca.setValue("status", passedCourseCount == totalCourseCount ? "Passed" : (inProgressCourseCount == 0 && passedCourseCount == 0) ? "New" : "In Progress");
@@ -518,7 +525,8 @@
 	}
 	else if ("Passed".equals(status) && !supressCert) {
 		Course c = Course.getCourse(ca.getCompanyID(), ca.getCourseAttemptCourseID());
-		String urlString = (c.isCourseCurriculum() ? "certificate_curriculum.jsp" : "certificate.jsp");
+		String urlString = c.getCourseCertificateGenerator();
+		if (urlString == null || urlString.length() < 1) urlString = (c.isCourseCurriculum() ? "certificate_curriculum.jsp" : "certificate.jsp");
 		urlString += "?ca=" + ca.getCourseAttemptID();
 		urlString += "&c=" + c.getCourseID();
 		urlString += "&up=" + ca.getCourseAttemptUserProfileID();
@@ -554,7 +562,8 @@
 					d = ca.getCourseAttemptCompleteDate();
 					endDate = (d != null && (endDate == 0 || endDate < d.getTime())) ? d.getTime() : endDate;
 
-					if (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED && !ca.isCourseAttemptExpired()) {
+					boolean finished = !((c.isCourseRequiresManagerApproval()) && (!ca.isCourseAttemptManagerApproved()));
+					if (finished && ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED && !ca.isCourseAttemptExpired()) {
 						int s = ca.getCourseAttemptScore();
 						++passedCourseCount;
 						if (s > -1) {
@@ -581,5 +590,6 @@
 	values.put("totalCourseCount", totalCourseCount);
 	values.put("timeFrame", timeFrame);
 
+logger.debug("curriculum: " + curriculumID + "; values: " + values);
 }
 %>

Modified: trunk/webapp/report_recurrent_training.jsp
===================================================================
--- trunk/webapp/report_recurrent_training.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/report_recurrent_training.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -174,7 +174,7 @@
                                     <td><a href="?action=csv"><img border="0" src="images/download_btn.gif" width="24" height="24" alt=""></a></td>
 					<td></td>
                                     <td><a href="?action=csv" class="formButtons">Download to Excel File </a></td>
-                                    <td><form action="#">View Upcoming Training Within The Next <input name="daysTilDue" size="5" value="<%=daysTilDue%>"/> Days <button>Go</button></form></td>
+                                    <td><form id="report_recurrent_training" action="report_recurrent_training.jsp">View Upcoming Training Within The Next <input name="daysTilDue" size="5" value="<%=daysTilDue%>"/> Days <button onclick="$.blockUI({ message: '<h3><img width=&quot;30&quot; height=&quot;30&quot; style=&quot;margin-right:10px;vertical-align:middle;&quot; src=&quot;images/loading.gif&quot;/> Generating Report...</h3>' });return true;">Go</button></form></td>
                                   </tr>
                                 </table>
                               </td>




More information about the Ils-source mailing list