[Ils-source] r1388 - in trunk: src/com/resolutions/ils/data webapp webapp/api/courseattempt webapp/api/courseattempt/cert webapp/api/courseattempt/cert/generate webapp/api/courseattempt/cert/get
scribe at crosswire.org
scribe at crosswire.org
Wed Feb 3 10:28:22 MST 2016
Author: scribe
Date: 2016-02-03 10:28:21 -0700 (Wed, 03 Feb 2016)
New Revision: 1388
Added:
trunk/webapp/api/courseattempt/cert/
trunk/webapp/api/courseattempt/cert/generate/
trunk/webapp/api/courseattempt/cert/generate/index.jsp
trunk/webapp/api/courseattempt/cert/get/
trunk/webapp/api/courseattempt/cert/get/index.jsp
trunk/webapp/certs/
Modified:
trunk/src/com/resolutions/ils/data/Course.java
trunk/src/com/resolutions/ils/data/CourseAttempt.java
trunk/webapp/admin_coursenew.jsp
trunk/webapp/aicc.jsp
trunk/webapp/certificate.jsp
trunk/webapp/certificate_curriculum.jsp
trunk/webapp/report_employeecourseatt.jsp
Log:
First working cut of saved certs with html to pdf generation
Modified: trunk/src/com/resolutions/ils/data/Course.java
===================================================================
--- trunk/src/com/resolutions/ils/data/Course.java 2016-01-25 21:43:26 UTC (rev 1387)
+++ trunk/src/com/resolutions/ils/data/Course.java 2016-02-03 17:28:21 UTC (rev 1388)
@@ -225,6 +225,13 @@
return query.getDataSet(LOOKUPCURRICULUMCOURSES);
}
+ public Vector<Course> getCurriculumCourses() {
+ Course query = new Course();
+ query.setCompanyID(getCompanyID());
+ query.setCourseID(getCourseID());
+ return query.getDataSet(LOOKUPCURRICULUMCOURSES);
+ }
+
static public int deleteCurriculumCourses(ILSSession session, int courseID) {
Course query = new Course();
query.setCompanyID(session.getCompanyID());
@@ -274,6 +281,10 @@
return getStringValue("COURSCKLISTURL");
}
+ public String getCourseCertificateGenerator() {
+ return getStringValue("COURSCERTGEN");
+ }
+
public String getCourseName() {
return getStringValue("COURSNAME");
}
@@ -352,6 +363,10 @@
setValue("COURSCKLISTURL", url);
}
+ public void setCourseCertificateGenerator(String val) {
+ setValue("COURSCERTGEN", val);
+ }
+
public void setCourseName(String name) {
setValue("COURSNAME", name);
}
Modified: trunk/src/com/resolutions/ils/data/CourseAttempt.java
===================================================================
--- trunk/src/com/resolutions/ils/data/CourseAttempt.java 2016-01-25 21:43:26 UTC (rev 1387)
+++ trunk/src/com/resolutions/ils/data/CourseAttempt.java 2016-02-03 17:28:21 UTC (rev 1388)
@@ -1,14 +1,17 @@
package com.resolutions.ils.data;
import org.apache.log4j.Logger;
-import org.crosswire.data.*;
+
+import org.crosswire.data.DataObject;
import org.crosswire.utils.HTTPUtils;
+import org.crosswire.utils.SMTPMail;
+import org.crosswire.utils.Utils;
import com.resolutions.ils.ILSSession;
-import com.resolutions.ils.Utils;
import java.util.Properties;
import java.util.Vector;
+import java.util.Collection;
import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
@@ -18,11 +21,44 @@
import java.util.GregorianCalendar;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpServletRequest;
+import java.awt.Dimension;
+import org.fit.cssbox.io.DefaultDocumentSource;
+import org.fit.cssbox.io.DocumentSource;
+import java.net.URLConnection;
+import java.net.URL;
+import java.io.IOException;
+import org.fit.cssbox.io.DOMSource;
+import org.w3c.dom.Document;
+import org.fit.cssbox.io.DefaultDOMSource;
+import cz.vutbr.web.css.MediaSpec;
+import org.fit.cssbox.css.DOMAnalyzer;
+import org.fit.cssbox.css.CSSNorm;
+import org.fit.cssbox.layout.BrowserCanvas;
+import org.fit.cssbox.layout.BrowserConfig;
+import java.awt.Font;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import org.fit.cssbox.layout.Viewport;
+import org.fit.cssbox.render.SVGRenderer;
+import org.apache.batik.transcoder.Transcoder;
+import org.apache.fop.svg.PDFTranscoder;
+import org.apache.batik.transcoder.TranscoderInput;
+import java.io.ByteArrayInputStream;
+import org.apache.batik.transcoder.TranscoderOutput;
+
+
+
+
public class CourseAttempt extends DataObject {
public static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); //"EEE MMM dd HH:mm:ss z yyyy");
@@ -78,13 +114,11 @@
return new CourseAttempt();
}
- static public Vector getUserCourseAttempts(ILSSession session, int userID,
- int courseID) {
+ static public Vector getUserCourseAttempts(ILSSession session, int userID, int courseID) {
return getUserCourseAttempts(session, userID, courseID, true);
}
- static public Vector getUserCourseAttempts(ILSSession session, int userID,
- int courseID, boolean includeExpireds) {
+ static public Vector getUserCourseAttempts(ILSSession session, int userID, int courseID, boolean includeExpireds) {
CourseAttempt query = new CourseAttempt();
query.setCompanyID(session.getCompanyID());
query.setCourseAttemptUserProfileID(userID);
@@ -153,13 +187,13 @@
String subject = Utils.replaceParams(subjectTemplate, params);
String body = Utils.replaceParams(bodyTemplate, params);
body += sysConfig.getProperty("SendMailSig", "");
- Utils.sendEmail(sysConfig, from, to, subject, body, true);
+ SMTPMail.sendEmail(sysConfig, from, to, subject, body, true);
}
catch (Exception e) {
e.printStackTrace();
}
}
- Utils.closeMailConnection();
+ SMTPMail.closeMailConnection();
}
System.out.println("**** revokeAllExpired: end");
return count;
@@ -232,13 +266,13 @@
String subject = Utils.replaceParams(subjectTemplate, params);
String body = Utils.replaceParams(bodyTemplate, params);
body += sysConfig.getProperty("SendMailSig", "");
- Utils.sendEmail(sysConfig, sysConfig.getProperty("SendMailFrom"), ca.getStringValue("USERPREMAIL"), subject, body, true);
+ SMTPMail.sendEmail(sysConfig, sysConfig.getProperty("SendMailFrom"), ca.getStringValue("USERPREMAIL"), subject, body, true);
}
catch (Exception e) {
e.printStackTrace();
}
}
- Utils.closeMailConnection();
+ SMTPMail.closeMailConnection();
}
return count;
}
@@ -301,8 +335,91 @@
}
+ public void passAllAssociatedCurriculum(ILSSession session) {
+ Collection<Course> curs = Course.getUserCurricula(session, getCourseAttemptUserProfileID());
+ if (curs != null) {
+ for (Course cur : curs) {
+ boolean isPassed = false;
+ Vector<Course> courses = cur.getCurriculumCourses();
+ if (courses != null) {
+ // is this course a member of the curriculum?
+ for (Course c : courses) {
+ if (c.getCourseID() == getCourseAttemptCourseID()) {
+ isPassed = true;
+ break;
+ }
+ }
+ // if so, then let's check if all courses are passed
+ int timeframe = 0;
+ long startDate = 0;
+ long endDate = 0;
+ int score = 0;
+ int courseCount = 0;
+ if (isPassed) {
+ for (Course c : courses) {
+ isPassed = false;
+ timeframe += c.getCourseSeatMinutes();
+ Vector<CourseAttempt> cas = CourseAttempt.getUserCourseAttempts(session, getCourseAttemptUserProfileID(), c.getCourseID(), false);
+ if (cas != null) {
+ for (CourseAttempt ca : cas) {
+ Date d = ca.getCourseAttemptStartDate();
+ startDate = (d != null && (startDate == 0 || startDate > d.getTime())) ? d.getTime() : startDate;
+ d = ca.getCourseAttemptCompleteDate();
+ endDate = (d != null && (endDate == 0 || endDate < d.getTime())) ? d.getTime() : endDate;
+
+ if (ca.getCourseAttemptStatusID() == STATUS_PASSED) {
+ int s = ca.getCourseAttemptScore();
+ if (s > -1) {
+ ++courseCount;
+ score += s;
+ }
+ isPassed = true;
+ break;
+ }
+ }
+ }
+ if (!isPassed) {
+ break;
+ }
+ }
+ }
+ // 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 (courseCount != 0) score /= courseCount;
+
+ CourseAttempt ca = new CourseAttempt();
+ ca.defaultAll();
+ ca.setCourseAttemptStartDate(new Date(startDate));
+ ca.setCourseAttemptCompleteDate(new Date(endDate));
+ ca.setCourseAttemptCourseID(cur.getCourseID());
+ ca.setCourseAttemptUserProfileID(getCourseAttemptUserProfileID());
+ ca.setCourseAttemptStatusID(ca.STATUS_PASSED);
+ ca.setCourseAttemptScore(score);
+
+ // TODO: timeframe?
+
+ ca = ca.saveNew(session);
+
+ // render certificate
+ String certgen = cur.getCourseCertificateGenerator();
+ if (certgen != null && certgen.trim().length() > 0) {
+ try {
+ ca.saveCertificate(ca.generateCertificate());
+ }
+ catch (Exception e) {
+ logger.error(e, e);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
static public Vector getSearchUserCourseAttempts(ILSSession session, int locID, int roleID,
String lName, String empNum, int statusID, int accessLevel, Date hireStartDate, Date hireEndDate,
int managerID, int courseID, int complianceID, Date sDate, Date eDate, boolean reqApprov) {
@@ -634,6 +751,54 @@
}
+
+
+ public byte[] getSavedCertificate() {
+ Properties sysConfig = Utils.getSysConfig(null, getCompanyID());
+ String certsFolder = sysConfig.getProperty("certsFolder", "certs");
+logger.debug("certsFolder: " + certsFolder);
+ File sysConfigPath = Utils.getSysConfigFile(null, getCompanyID());
+ File certs = new File(sysConfigPath.getParentFile().getParent(), certsFolder);
+logger.debug("certsFolderPath: " + certs.getAbsolutePath());
+ if (certs.exists()) {
+ String certName = String.format("%08d_%08d_%08d.pdf", getCourseAttemptUserProfileID(), getCourseAttemptCourseID(), getCourseAttemptID());
+ File cert = new File(certs, certName);
+logger.debug("certPath: " + cert.getAbsolutePath());
+ if (cert.exists()) {
+ try {
+logger.debug("Exists!");
+ byte[] certBytes = DataObject.getBytes(new FileInputStream(cert));
+logger.debug("certBytes: " + certBytes);
+ return certBytes;
+ }
+ catch (Exception e) {
+logger.debug(e);
+ }
+ }
+ }
+ return null;
+ }
+
+
+ public void saveCertificate(byte [] certData) throws Exception {
+ Properties sysConfig = Utils.getSysConfig(null, getCompanyID());
+ String certsFolder = sysConfig.getProperty("certsFolder", "certs");
+ File sysConfigPath = Utils.getSysConfigFile(null, getCompanyID());
+ File certs = new File(sysConfigPath.getParentFile().getParent(), certsFolder);
+ if (!certs.exists()) {
+ certs.mkdir();
+ }
+ String certName = String.format("%08d_%08d_%08d.pdf", getCourseAttemptUserProfileID(), getCourseAttemptCourseID(), getCourseAttemptID());
+ File cert = new File(certs, certName);
+ if (cert.exists()) {
+ cert.delete();
+ }
+ FileOutputStream fos = new FileOutputStream(cert);
+ fos.write(certData);
+ fos.close();
+ }
+
+
static public Vector getCourseAttempts(ILSSession session, Date sDate, Date eDate) {
String sql = "SELECT * FROM COURSEATTEMPT CA, USERPROFILE UP, COURSE CR WHERE CA.USERPRID=UP.USERPRID AND CA.COURSID=CR.COURSID AND UP.COMPANYID={COMPANYID}";
CourseAttempt retVal = new CourseAttempt();
@@ -744,7 +909,7 @@
body += "Login Account: " + up.getUserProfileNum() + "\n";
body += "Course Name : " + course.getCourseName() + "\n\n";
body += sysConfig.getProperty("SendMailSig", "");
- Utils.sendEmail(httpSession, sysConfig.getProperty("SendMailFrom", ilsSession.getCurrentCompany().getCompanyAdminContactEMail()), up.getUserProfileEMail(), subject, body, true);
+ SMTPMail.sendEmail(httpSession, sysConfig.getProperty("SendMailFrom", ilsSession.getCurrentCompany().getCompanyAdminContactEMail()), up.getUserProfileEMail(), subject, body, true);
}
catch (Exception e) {
e.printStackTrace();
@@ -752,6 +917,146 @@
}
}
+ public byte[] generateCertificate(ILSSession ilsSession, HttpServletRequest request) throws Exception {
+
+
+ Course c = Course.getCourse(ilsSession, getCourseAttemptCourseID());
+
+/*
+ response.setContentType("application/pdf");
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ Document document = new Document();
+ PdfWriter writer = PdfWriter.getInstance(document, bout);
+ writer.setInitialLeading(12);
+ document.open();
+ XMLWorkerHelper.getInstance().parseXHtml(writer, document, new FileInputStream(HTML));
+ document.close();
+ byte[] certData = bout.getByteArray();
+*/
+ // response.setContentType("image/svg+xml");
+
+ String mediaType = "print";
+ Dimension windowSize = new Dimension(850, 1100);
+
+ String baseURL = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
+ String urlString = baseURL;
+ String certGen = c.getCourseCertificateGenerator();
+ if (certGen != null && certGen.length() > 0 && !"default".equals(certGen)) {
+ urlString += "/" + certGen;
+ }
+ else {
+ urlString += (c.isCourseCurriculum() ? "/certificate_curriculum.jsp" : "/certificate.jsp");
+ }
+
+ urlString += "?ca=" + getCourseAttemptID();
+ urlString += "&c=" + c.getCourseID();
+ urlString += "&up=" + getCourseAttemptUserProfileID();
+
+ if (!urlString.startsWith("http:") &&
+ !urlString.startsWith("ftp:") &&
+ !urlString.startsWith("file:"))
+ urlString = "http://" + urlString;
+
+ final String sessionID = request.getSession().getId();
+ DocumentSource docSource = new DefaultDocumentSource(urlString) {
+ protected URLConnection createConnection(URL url) throws IOException {
+ URLConnection uc = super.createConnection(url);
+ uc.setRequestProperty("Cookie","JSESSIONID=" + sessionID);
+ return uc;
+ }
+ };
+
+ //Parse the input document
+ DOMSource parser = null;
+ Document doc = null;
+ try {
+ parser = new DefaultDOMSource(docSource);
+ doc = parser.parse();
+ }
+ catch (Exception e) {
+ throw new Exception("Failed to generate certificate with generator: " + urlString);
+ }
+
+ //create the media specification
+ MediaSpec media = new MediaSpec(mediaType);
+ media.setDimensions(windowSize.width, windowSize.height);
+ media.setDeviceDimensions(windowSize.width, windowSize.height);
+
+ //Create the CSS analyzer
+ DOMAnalyzer da = new DOMAnalyzer(doc, docSource.getURL());
+ da.setMediaSpec(media);
+ da.attributesToStyles(); //convert the HTML presentation attributes to inline styles
+ da.addStyleSheet(null, CSSNorm.stdStyleSheet(), DOMAnalyzer.Origin.AGENT); //use the standard style sheet
+ da.addStyleSheet(null, CSSNorm.userStyleSheet(), DOMAnalyzer.Origin.AGENT); //use the additional style sheet
+ da.addStyleSheet(null, CSSNorm.formsStyleSheet(), DOMAnalyzer.Origin.AGENT); //render form fields using css
+ da.getStyleSheets(); //load the author style sheets
+
+ BrowserCanvas contentCanvas = new BrowserCanvas(da.getRoot(), da, docSource.getURL());
+ contentCanvas.setAutoMediaUpdate(false); //we have a correct media specification, do not update
+ contentCanvas.getConfig().setClipViewport(false);
+ contentCanvas.getConfig().setLoadImages(true);
+ contentCanvas.getConfig().setLoadBackgroundImages(false);
+
+ BrowserConfig bconfig = contentCanvas.getConfig();
+ bconfig.setDefaultFont(Font.SERIF, "Times New Roman");
+ bconfig.setDefaultFont(Font.SANS_SERIF, "Arial");
+ bconfig.setDefaultFont(Font.MONOSPACED, "Courier New");
+ contentCanvas.createLayout(windowSize);
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ Writer oswrite = new OutputStreamWriter(bout, "utf-8");
+ Viewport vp = contentCanvas.getViewport();
+
+ int w = vp.getClippedContentBounds().width;
+ int h = vp.getClippedContentBounds().height;
+
+ SVGRenderer render = new SVGRenderer(w, h, oswrite);
+ vp.draw(render);
+ render.close();
+
+ oswrite.close();
+
+ docSource.close();
+ byte[] certData = bout.toByteArray();
+
+ /* Convert from SVG to PDF
+ *
+ */
+ Transcoder transcoder = new PDFTranscoder();
+ // transcoder.addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, java.awt.Color.WHITE);
+ // transcoder.addTranscodingHint(ImageTranscoder.KEY_FORCE_TRANSPARENT_WHITE, true);
+ TranscoderInput transcoderInput = new TranscoderInput(new ByteArrayInputStream(certData));
+ ByteArrayOutputStream bout2 = new ByteArrayOutputStream();
+ TranscoderOutput transcoderOutput = new TranscoderOutput(bout2);
+ transcoder.transcode(transcoderInput, transcoderOutput);
+ bout2.flush();
+
+ certData = bout2.toByteArray();
+ return certData;
+
+ /*
+ */
+
+ /* Convert from SVG to JPG
+ *
+ *
+ Transcoder transcoder = new JPEGTranscoder();
+ // transcoder.addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, java.awt.Color.WHITE);
+ // transcoder.addTranscodingHint(ImageTranscoder.KEY_FORCE_TRANSPARENT_WHITE, true);
+ TranscoderInput transcoderInput = new TranscoderInput(new ByteArrayInputStream(certData));
+ ByteArrayOutputStream bout2 = new ByteArrayOutputStream();
+ TranscoderOutput transcoderOutput = new TranscoderOutput(bout2);
+ transcoder.transcode(transcoderInput, transcoderOutput);
+ bout2.flush();
+
+ certData = bout2.toByteArray();
+ response.setContentType("image/jpeg");
+ *
+ */
+
+ }
+
+
+
public static String getINIValue(String data, String key) {
String value = "";
int i = data.toLowerCase().indexOf(key.toLowerCase() + "=");
Modified: trunk/webapp/admin_coursenew.jsp
===================================================================
--- trunk/webapp/admin_coursenew.jsp 2016-01-25 21:43:26 UTC (rev 1387)
+++ trunk/webapp/admin_coursenew.jsp 2016-02-03 17:28:21 UTC (rev 1388)
@@ -1,554 +1,561 @@
-<%@ page
- language="java"
- contentType="text/html;charset=utf-8"
-%>
-<%@ page import="com.resolutions.ils.*" %>
-<%@ page import="com.resolutions.ils.data.*" %>
-<%@ page import="java.util.Vector" %>
-<%@ page import="java.util.Comparator" %>
-<%@ page import="java.util.Date" %>
-<%@ page import="java.io.File" %>
-<%@ page import="java.util.List" %>
-<%@ page import="java.net.URL" %>
-<%@ page import="java.text.SimpleDateFormat" %>
-<%@ page import="org.apache.commons.fileupload.*" %>
-<%@ page import="org.apache.log4j.Logger" %>
-
-
-<%
- Logger logger = Logger.getLogger(this.getClass());
- Logger eventsLogger = Logger.getLogger("EVENTS");
- String statusMsg = "";
- String validError = "";
- ILSSession ilsSession = (ILSSession)session.getAttribute("ilsSession");
- if (ilsSession == null) {
- out.print("<html><head><META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=login.jsp\"></head></html>");
- return;
- }
-
- UserProfile user = ilsSession.getCurrentUserProfile();
- if ((user.getUserProfileAccessLevel() < UserProfile.ACCESS_ADMIN) && (!user.hasAccess(UserProfile.ACCESS_MODE_MENU_COURSE_MGMT))) {
- out.print("<html><body><h1>You do not have access to this feature</h1></body></html>");
- eventsLogger.info("Access denied to user ["+user.getUserProfileNum()+"]");
- return;
- }
-
- Course current = null;
-
-
- String action = request.getParameter("action");
- String courseID = request.getParameter("courseid");
- DiskFileUpload fu = null;
- List fileItems = null;
-
- if (action == null) {
- try {
- fu = new DiskFileUpload();
- // maximum size before a FileUploadException will be thrown
- fu.setSizeMax(99000000);
- // maximum size that will be stored in memory
- fu.setSizeThreshold(4096);
- // the location for saving data that is larger than getSizeThreshold()
- fu.setRepositoryPath(session.getServletContext().getRealPath("tmp/"));
-
- fileItems = fu.parseRequest(request);
- for (int i = 0; i < fileItems.size(); i++) {
- FileItem fi = (FileItem)fileItems.get(i);
- if (fi.isFormField()) {
- if ("action".equals(fi.getFieldName())) {
- action = fi.getString();
- }
- if ("courseid".equals(fi.getFieldName())) {
- courseID = fi.getString();
- }
- }
- }
- }
- catch (Exception e) { logger.error(e);}
- }
-
- SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
-
- if (courseID != null) {
- try {
- current = Course.getCourse(ilsSession, Integer.parseInt(courseID));
- }
- catch (Exception e) { logger.error(e); }
- }
-
- if (current == null) {
- current = new Course();
- current.defaultAll();
- // set quickView value in case we've been called to create specifically a quickView course
- String val = request.getParameter("quickView");
- try { if (val != null) current.setCourseQuickView(Integer.parseInt(val)>0); } catch (Exception e) { logger.error(e); }
- }
-
- Vector tmp = Compliance.getCourseCompliancies(ilsSession, current.getCourseID());
- int currentComplianceID = ((tmp != null) && (tmp.size()>0)) ? ((Compliance)tmp.get(0)).getComplianceID() : -1;
-
- if ("revokeExpCourses".equals(action)) {
- if (current.getCourseID() > 0) {
- boolean emailNotice = "on".equals(Utils.getSysConfig(session).getProperty("EmailEnableAssignedRetakes", "off"));
- int count = CourseAttempt.revokeAllExpired(ilsSession.getCompanyID(), current.getCourseID(), session.getServletContext(), emailNotice);
- statusMsg = "Assigned " + Integer.toString(count) + " Recurrent Trainings for Course " + current.getCourseNum() + ".";
- eventsLogger.info(statusMsg + " by user: " + ilsSession.getCurrentUserProfile().getUserProfileNum());
- }
- else {
- validError = "You must be editing a saved course with assigned users to perform this action.";
- }
- }
- else if ("Save".equals(action)) {
- statusMsg = "Warning: Your changes have not been saved.";
- Course orig = (Course)current.clone();
- String cert = null;
- try {
- boolean ipRestrictedValue = false;
- for (int i = 0; i < fileItems.size(); i++) {
- FileItem fi = (FileItem)fileItems.get(i);
- if (fi.isFormField()) {
- if ("num".equals(fi.getFieldName())) {
- if (fi.getString() != null) current.setCourseNum(fi.getString());
- }
- else if ("name".equals(fi.getFieldName())) {
- if (fi.getString() != null) current.setCourseName(fi.getString());
- }
- else if ("desc".equals(fi.getFieldName())) {
- if (fi.getString() != null) current.setCourseDesc(fi.getString());
- }
- else if ("statusID".equals(fi.getFieldName())) {
- if (fi.getString() != null) try { current.setCourseActive(Integer.parseInt(fi.getString())>0); } catch (Exception e) { logger.error(e); }
- }
- else if ("ipRestrict".equals(fi.getFieldName())) {
- if (fi.getString() != null) current.setCourseIPRestricted(fi.getString());
- }
- else if ("activeDate".equals(fi.getFieldName())) {
- if (fi.getString() != null) try { current.setCoursePostDate(df.parse(fi.getString())); } catch (Exception e) { logger.error(e); }
- }
- else if ("mgrApprvl".equals(fi.getFieldName())) {
- if (fi.getString() != null) try { current.setCourseRequiresManagerApproval(Integer.parseInt(fi.getString())>0); } catch (Exception e) { logger.error(e); }
- }
- else if ("quickView".equals(fi.getFieldName())) {
- if (fi.getString() != null) try { current.setCourseQuickView(Integer.parseInt(fi.getString())>0); } catch (Exception e) { logger.error(e); }
- }
- else if ("type".equals(fi.getFieldName())) {
- if (fi.getString() != null) try { current.setCourseTypeID(Integer.parseInt(fi.getString())); } catch (Exception e) { logger.error(e); }
- }
- else if ("locURL".equals(fi.getFieldName())) {
- if (fi.getString() != null) current.setCourseURL(fi.getString());
- }
- else if ("mins".equals(fi.getFieldName())) {
- if (fi.getString() != null) try { current.setCourseSeatMinutes(Integer.parseInt(fi.getString())); } catch (Exception e) { logger.error(e); }
- }
- else if ("pass".equals(fi.getFieldName())) {
- if (fi.getString() != null) try { current.setCoursePass(Integer.parseInt(fi.getString())); } 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); }
- }
- else if ("passreassign".equals(fi.getFieldName())) {
- if (fi.getString() != null) try { current.setCourseReassignBeforeDays(Integer.parseInt(fi.getString())); } catch (Exception e) { logger.error(e); }
- }
- else if ("cert".equals(fi.getFieldName())) {
- if (fi.getString() != null) cert =fi.getString();
- }
- }
- }
- }
- catch (Exception e) { logger.error(e);}
-
- if ((current.getCourseNum() == null) || (current.getCourseNum().length() < 1))
- validError = "You must supply a Course Number";
- else if ((current.getCourseName() == null) || (current.getCourseName().length() < 1))
- validError = "You must supply a Course Name";
- else if ((current.getCourseURL() == null) || (current.getCourseURL().length() < 1))
- validError = "You must supply a URL/File Path";
- else {
- if (orig.getCourseID()>0)
- current.save(ilsSession, orig);
- else current = current.saveNew(ilsSession);
-
- // see if we have a file to upload
- try {
- for (int i = 0; i < fileItems.size(); i++) {
- FileItem fi = (FileItem)fileItems.get(i);
- if (!fi.isFormField()) {
- // filename on the client
- String fileName = fi.getName();
- if ((fileName != null) && (fileName.length() > 1)) {
- int fStart = fileName.lastIndexOf('\\');
- if (fStart < 0) fStart = fileName.lastIndexOf('/');
- if (fStart > 0) fileName = fileName.substring(fStart+1);
- String fName = "resources/checkList_"+Integer.toString(current.getCompanyID()) + "_" + Integer.toString(current.getCourseID()) +"_" + fileName;
- File upFile = new File(session.getServletContext().getRealPath(fName));
- fi.write(upFile);
- // must save again. We have to do this after the first save because we include the courseID in the
- // checlist name. We don't know the courseID, if we're a new course, until after we saveNew
- orig = (Course)current.clone();
- current.setCourseChecklistURL(fName);
- // we can't be new at this point, so just save()
- current.save(ilsSession, orig);
- }
- }
- }
- }
- catch (Exception e) { logger.error(e); }
-
-
- if ((cert != null) && (Integer.parseInt(cert) != currentComplianceID) && (Integer.parseInt(cert) > -1)) {
- Compliance.deleteCourseCompliancies(ilsSession, current.getCourseID());
- Compliance.addCourseCompliance(ilsSession, current.getCourseID(), Integer.parseInt(cert));
- }
-
- courseID = Integer.toString(current.getCourseID());
- tmp = Compliance.getCourseCompliancies(ilsSession, current.getCourseID());
- currentComplianceID = ((tmp != null) && (tmp.size()>0)) ? ((Compliance)tmp.get(0)).getComplianceID() : -1;
- statusMsg = "Your changes have been saved.";
- }
- }
-
- if ("SaveRoles".equals(action)) {
- try {
- Group.deleteCourseGroups(ilsSession, Group.GROUPTYPE_ROLE, current.getCourseID());
- }
- catch (Exception e1) { logger.error(e1); }
- String []roleids = request.getParameterValues("roleid");
- if (roleids != null) {
- for (int i = 0; i < roleids.length; i++) {
- Group.addCourseGroup(ilsSession, Integer.parseInt(roleids[i]), current.getCourseID());
- }
- }
- statusMsg = "Your changes have been saved.";
- }
-
- Vector certs = Compliance.getAllCompliancies(ilsSession);
-
-%>
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
- <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" src="js/jquery/jquery.min.js"></script>
-
-<style>
-
-.almostFull {
- color : red;
-}
-
-</style>
-
- <script type="text/javascript" language="JavaScript">
-//<!--
-function rD(val) {
- document.coursesave.activeDate.value = val;
-}
-function rC(val) {
- document.coursesave.locURL.value = 'courses/'+val;
-}
-
-function confirmRevoke() {
- if (confirm("Running this routine will assign this course as recurrent training to all applicable users. Are you sure?")) {
- document.getElementById("sysMaintAction").value = 'revokeExpCourses';
- document.sysmaint.submit();
- }
-}
-
-function updateRemainingDescription() {
- var limit = 500;
- var d = $('#courseDescription').val();
- if (d.length > limit) { d = d.substring(0,limit); $('#courseDescription').val(d); }
- if (d.length >= (limit-100)) $('#remainingDescription').addClass('almostFull');
- else $('#remainingDescription').removeClass('almostFull');
- $('#remainingDescription').html((limit-d.length) + ' Remaining ');
-}
-
-$(document).ready(function() {
- updateRemainingDescription();
- $('#courseDescription').on('change keyup paste', updateRemainingDescription);
-})
-
-
-// -->
-
-
-
-</script>
- </head>
-
- <body>
-<%@ include file="header.jsp" %>
- <div id="pageContainer">
-<%@ include file="menu.jsp" %>
-<div id="content">
- <div id="pageTitles">
- Course Management<br/>
- <span class="instructiontxt"><%= statusMsg %></span>
- <span class="instructiontxt"><%= validError %></span>
- </div>
- <br>
- <table cellpadding="0" cellspacing="0" id="tableForm">
-<tr>
- <th><%=(courseID==null)?"New" : "Edit"%> Course</th>
- </tr>
- <tr>
- <td><form name="coursesave" method="post" action="admin_coursenew.jsp" enctype="multipart/form-data">
- <input type="hidden" name="action" value="Save"/>
- <input type="hidden" name="courseid" value="<%=courseID%>"/>
- <table id="tableFormData">
- <tr>
- <td class="formHeadings" style="padding-top:3px">Course No. :</td>
- <td style="padding-top:3px"><input name="num" type="text" value="<%=current.getCourseNum()%>" size="40"/></td>
- </tr>
- <tr>
- <td class="formHeadings">Course Name :</td>
- <td><input name="name" type="text" value="<%=current.getCourseName()%>" size="40"/> </td>
- </tr>
- <tr>
- <td class="formHeadings">Course Description :<br/><span id="remainingDescription">500 Remaining </span></td>
- <td><textarea id="courseDescription" style="width:100%" name="desc" rows="7" cols="40"><%=current.getCourseDesc()%></textarea></td>
- </tr>
- <tr>
- <td class="formHeadings">Active Date : </td>
- <%
- Date postDate = current.getCoursePostDate();
- if (postDate == null) postDate = new Date();
-%>
- <td><input style="width:100%" name="activeDate" type="text" value="<%=df.format(postDate)%>" size="12"/>
- <a href="#" onClick="showCal(document.coursesave.activeDate.value);return false;"><img border="0" src="images/calendar_btn.gif" width="18" height="18" alt=""/></a></td>
- </tr>
- <tr>
- <td class="formHeadings">Status :</td>
- <td><select name="statusID">
- <option value="1" <%=(current.isCourseActive())?"selected=\"true\"":""%>>Active</option>
- <option value="0" <%=(!current.isCourseActive())?"selected=\"true\"":""%>>Inactive</option>
- </select></td>
- </tr>
- <tr>
- <td class="formHeadings">Display Course in Course Catalog :</td>
- <td><select name="ipRestrict">
- <option value="F" <%=(!"I".equals(current.getCourseIPRestricted()) && !"N".equals(current.getCourseIPRestricted()))?"selected=\"true\"":""%>>To All IP Addresses</option>
- <option value="I" <%=("I".equals(current.getCourseIPRestricted()))?"selected=\"true\"":""%>>Only To Restricted IP Addresses</option>
- <option value="N" <%=("N".equals(current.getCourseIPRestricted()))?"selected=\"true\"":""%>>Only To Non-Restricted IP Addresses</option>
- </select></td>
- </tr>
- <tr>
- <td class="formHeadings">Display in :</td>
- <td><select name="quickView">
- <option value="0" <%=(!current.isCourseQuickView())?"selected=\"true\"":""%>>Course Catalog</option>
- <option value="1" <%=(current.isCourseQuickView())?"selected=\"true\"":""%>>Quick View</option>
- </select> </td>
- </tr>
- <tr>
- <td class="formHeadings">Type :</td>
- <td><select name="type">
- <option value="1" <%=(current.getCourseTypeID()==1)?"selected=\"true\"":""%>>AICC / HACP</option>
- <option value="2" <%=(current.getCourseTypeID()==2)?"selected=\"true\"":""%>>eXpress course</option>
- </select></td>
- </tr>
- <tr>
- <td class="formHeadings">URL / File Path: </td>
- <td><table>
- <tr>
- <td><input name="locURL" type="text" value="<%=current.getCourseURL()%>" size="40"/> </td>
- <td width="52"><table width="21%" border="0">
- <tr>
- <td width="12%"><a href="#" onClick="showList(1, 'courses');return false;"><img border="0" src="images/browse_btn.gif" width="24" height="24" alt=""/></a></td>
- <td width="88%"><a href="#" class="formButtons" onClick="showList(1, 'courses');return false;">Browse</a></td>
- </tr>
- </table></td>
- </tr>
- </table></td>
- </tr>
- <tr>
- <td class="formHeadings">Certification:</td>
- <td><table>
- <tr>
- <td width="130"><select name="cert">
- <option <%=(currentComplianceID == -1) ? "selected=\"selected\"":""%> value="-1">Select Certification</option>
- <%
- for (int i = 0; i < certs.size(); i++) {
- Compliance cert = (Compliance)certs.get(i);
-%>
- <option value="<%=cert.getComplianceID()%>" <%=(cert.getComplianceID() == currentComplianceID)?"selected=\"true\"":""%>><%=cert.getComplianceName()%></option>
- <%
- }
-%>
- </select> </td>
- <td><table>
- <tr>
- <td width="12%"><a href="admin_complianceedit.jsp"><img border="0" src="images/Add.gif" width="24" height="24" alt=""/></a></td>
- <td width="88%"><a href="admin_complianceedit.jsp" class="formButtons">Add Certification</a></td>
- </tr>
- </table></td>
- </tr>
- </table></td>
- </tr>
- <tr>
- <td class="formHeadings">Seat Minutes : </td>
- <td><input name="mins" type="text" value="<%=current.getCourseSeatMinutes()%>" size="6"/> </td>
- </tr>
- <tr>
- <td class="formHeadings">Passing Score : </td>
- <td><input name="pass" type="text" value="<%=current.getCoursePass()%>" size="6"/> % </td>
- </tr>
- <tr>
- <td class="formHeadings">Course Certificate Expires After </td>
- <td><input name="passexp" type="text" value="<%=current.getCoursePassExpireDays()%>" size="6"/> Days</td>
- </tr>
- <tr>
- <td class="formHeadings">Reassign As Recurrent Training </td>
- <td><input name="passreassign" type="text" value="<%=current.getCourseReassignBeforeDays()%>" size="6"/> Days Before Expiration</td>
- </tr>
- <tr>
- <td class="formHeadings">Reassign Now As Recurrent Training To All Applicable Users</td>
- <td><a href="#" onClick="confirmRevoke(); return false;"><img border="0" src="images/run_btn.gif" width="51" height="24" alt="Perform Action"/></a></td>
- </tr>
- <tr>
- <td class="formHeadings">Requires Management Approval for Completion: </td>
- <td colspan="2">
- <select name="mgrApprvl">
- <option value="0" <%=(!current.isCourseRequiresManagerApproval())?"selected=\"true\"":""%>>No</option>
- <option value="1" <%=(current.isCourseRequiresManagerApproval())?"selected=\"true\"":""%>>Yes</option>
- </select> </td>
- </tr>
- <tr>
-
-
-
- <td class="formHeadings">Approval Checklist: </td>
- <td>
-
- <% if ((current.getCourseChecklistURL() != null) && (current.getCourseChecklistURL().length() > 0)) { %>
-
- <table>
- <tr>
- <td width="52"><table width="21%" border="0">
- <tr>
- <td width="12%"><a href="#" onClick="window.open('<%=current.getCourseChecklistURL()%>','Resource','width=800,height=600');return false;"><img border="0" src="images/browse_btn.gif" width="20" height="20" alt=""/></a></td>
- <td width="88%"><a href="#" class="formButtons" onClick="window.open('<%=current.getCourseChecklistURL()%>','Resource','width=800,height=600');return false;">View Checklist</a></td>
- </tr>
- </table></td>
- </tr>
- </table>
-
- <% } else { %>
-
- None Uploaded
-
- <% } %>
-
- </td>
- </tr>
- <tr>
- <td class="formHeadings">Upload Approval Checklist : </td>
- <td><input name="file" type="file" size="40" /></td>
- </tr>
- <tr>
- <td class="formHeadings"> </td>
- <td colspan="2"><a href="#" onClick="document.coursesave.submit()"><br>
- <img border="0" src="images/save_btn.gif" width="68" height="24" hspace="3" alt=""/></a><a href="admin_coursemanagement.jsp"><img border="0" src="images/cancel_btn.gif" width="72" height="24" alt=""/></a></td>
- </tr>
- </table>
- </form></td>
- </tr>
- </table>
- <br/>
-<%
-if (current.getCourseID() > 0) {
- Vector roles = Group.getAllGroups(ilsSession, Group.GROUPTYPE_ROLE);
-
- final String sort = request.getParameter("sort");
-
- if (sort != null) {
- if (roles != null) {
- java.util.Collections.sort(roles, new Comparator() {
- public int compare(Object o1, Object o2) {
- if ("name".equals(sort)) {
- return ((Group)o1).getGroupName().compareTo(((Group)o2).getGroupName());
- }
- if ("desc".equals(sort)) {
- return ((Group)o1).getGroupDesc().compareTo(((Group)o2).getGroupDesc());
- }
- return 0;
- }
- });
- }
- }
- Vector tmp2 = Group.getCourseGroups(ilsSession, current.getCourseID());
- Vector inCourse = new Vector();
- for (int i = 0; i < tmp2.size(); i++) {
- inCourse.add(new Integer(((Group)tmp2.get(i)).getGroupID()));
- }
-%>
-<form name="courserolesave" method="post" action="admin_coursenew.jsp">
- <input type="hidden" name="action" value="SaveRoles"/>
- <input type="hidden" name="courseid" value="<%=courseID%>"/>
-
- <table width="100%" border="0" cellpadding="0" cellspacing="0" class="tableMain">
- <tr>
- <th><t:t>Assigned to Roles</t:t></th>
- </tr>
- <tr>
- <td class="tableBTN">
- <table width="196" border="0" align="left">
- <tr>
- <td width="90">
- <table width="90" border="0">
- <tr>
- <td width="12%"><a href="#" onClick="document.courserolesave.submit()"><img border="0" src="images/saveicon_btn.gif" width="24" height="24" alt=""/></a></td>
- <td width="88%"><a href="#" class="formButtons" onClick="document.courserolesave.submit()">Save</a></td>
- </tr>
- </table> </td>
- <td width="96">
- <table width="96" border="0">
- <tr>
- <td width="12%"><a href="admin_coursemanagement.jsp"><img border="0" src="images/delete_btn.gif" width="24" height="24" alt=""/></a></td>
- <td width="88%"><a href="admin_coursemanagement.jsp" class="formButtons">Cancel</a></td>
- </tr>
- </table> </td>
- </tr>
- </table> </td>
- </tr>
- <tr>
- <td>
- <table class="tableData">
- <tr>
- <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>
-<%
- for (int i = 0; i < roles.size(); i++) {
- Group role = (Group)roles.get(i);
- 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><%=role.getGroupName()%></td>
- <td><%=role.getGroupDesc()%></td>
- </tr>
-<%
- }
-%>
- </table> </td>
- </tr>
- </table>
-</form>
-<%
- }
-%>
-</div>
-
- <form style="display:none;" name="sysmaint" method="post" action="admin_coursenew.jsp">
- <input type="hidden" id="sysMaintAction" name="action" value=""/>
- <input type="hidden" name="courseid" value="<%= current.getCourseID() %>"/>
- </form>
-
-<%@ include file="footer.jsp" %>
-</div>
-</body>
-</html>
+<%@ page
+ language="java"
+ contentType="text/html;charset=utf-8"
+%>
+<%@ page import="com.resolutions.ils.*" %>
+<%@ page import="com.resolutions.ils.data.*" %>
+<%@ page import="java.util.Vector" %>
+<%@ page import="java.util.Comparator" %>
+<%@ page import="java.util.Date" %>
+<%@ page import="java.io.File" %>
+<%@ page import="java.util.List" %>
+<%@ page import="java.net.URL" %>
+<%@ page import="java.text.SimpleDateFormat" %>
+<%@ page import="org.apache.commons.fileupload.*" %>
+<%@ page import="org.apache.log4j.Logger" %>
+
+
+<%
+ Logger logger = Logger.getLogger(this.getClass());
+ Logger eventsLogger = Logger.getLogger("EVENTS");
+ String statusMsg = "";
+ String validError = "";
+ ILSSession ilsSession = (ILSSession)session.getAttribute("ilsSession");
+ if (ilsSession == null) {
+ out.print("<html><head><META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=login.jsp\"></head></html>");
+ return;
+ }
+
+ UserProfile user = ilsSession.getCurrentUserProfile();
+ if ((user.getUserProfileAccessLevel() < UserProfile.ACCESS_ADMIN) && (!user.hasAccess(UserProfile.ACCESS_MODE_MENU_COURSE_MGMT))) {
+ out.print("<html><body><h1>You do not have access to this feature</h1></body></html>");
+ eventsLogger.info("Access denied to user ["+user.getUserProfileNum()+"]");
+ return;
+ }
+
+ Course current = null;
+
+
+ String action = request.getParameter("action");
+ String courseID = request.getParameter("courseid");
+ DiskFileUpload fu = null;
+ List fileItems = null;
+
+ if (action == null) {
+ try {
+ fu = new DiskFileUpload();
+ // maximum size before a FileUploadException will be thrown
+ fu.setSizeMax(99000000);
+ // maximum size that will be stored in memory
+ fu.setSizeThreshold(4096);
+ // the location for saving data that is larger than getSizeThreshold()
+ fu.setRepositoryPath(session.getServletContext().getRealPath("tmp/"));
+
+ fileItems = fu.parseRequest(request);
+ for (int i = 0; i < fileItems.size(); i++) {
+ FileItem fi = (FileItem)fileItems.get(i);
+ if (fi.isFormField()) {
+ if ("action".equals(fi.getFieldName())) {
+ action = fi.getString();
+ }
+ if ("courseid".equals(fi.getFieldName())) {
+ courseID = fi.getString();
+ }
+ }
+ }
+ }
+ catch (Exception e) { logger.error(e);}
+ }
+
+ SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
+
+ if (courseID != null) {
+ try {
+ current = Course.getCourse(ilsSession, Integer.parseInt(courseID));
+ }
+ catch (Exception e) { logger.error(e); }
+ }
+
+ if (current == null) {
+ current = new Course();
+ current.defaultAll();
+ // set quickView value in case we've been called to create specifically a quickView course
+ String val = request.getParameter("quickView");
+ try { if (val != null) current.setCourseQuickView(Integer.parseInt(val)>0); } catch (Exception e) { logger.error(e); }
+ }
+
+ Vector tmp = Compliance.getCourseCompliancies(ilsSession, current.getCourseID());
+ int currentComplianceID = ((tmp != null) && (tmp.size()>0)) ? ((Compliance)tmp.get(0)).getComplianceID() : -1;
+
+ if ("revokeExpCourses".equals(action)) {
+ if (current.getCourseID() > 0) {
+ boolean emailNotice = "on".equals(Utils.getSysConfig(session).getProperty("EmailEnableAssignedRetakes", "off"));
+ int count = CourseAttempt.revokeAllExpired(ilsSession.getCompanyID(), current.getCourseID(), session.getServletContext(), emailNotice);
+ statusMsg = "Assigned " + Integer.toString(count) + " Recurrent Trainings for Course " + current.getCourseNum() + ".";
+ eventsLogger.info(statusMsg + " by user: " + ilsSession.getCurrentUserProfile().getUserProfileNum());
+ }
+ else {
+ validError = "You must be editing a saved course with assigned users to perform this action.";
+ }
+ }
+ else if ("Save".equals(action)) {
+ statusMsg = "Warning: Your changes have not been saved.";
+ Course orig = (Course)current.clone();
+ String cert = null;
+ try {
+ boolean ipRestrictedValue = false;
+ for (int i = 0; i < fileItems.size(); i++) {
+ FileItem fi = (FileItem)fileItems.get(i);
+ if (fi.isFormField()) {
+ if ("num".equals(fi.getFieldName())) {
+ if (fi.getString() != null) current.setCourseNum(fi.getString());
+ }
+ else if ("name".equals(fi.getFieldName())) {
+ if (fi.getString() != null) current.setCourseName(fi.getString());
+ }
+ else if ("desc".equals(fi.getFieldName())) {
+ if (fi.getString() != null) current.setCourseDesc(fi.getString());
+ }
+ else if ("statusID".equals(fi.getFieldName())) {
+ if (fi.getString() != null) try { current.setCourseActive(Integer.parseInt(fi.getString())>0); } catch (Exception e) { logger.error(e); }
+ }
+ else if ("ipRestrict".equals(fi.getFieldName())) {
+ if (fi.getString() != null) current.setCourseIPRestricted(fi.getString());
+ }
+ else if ("activeDate".equals(fi.getFieldName())) {
+ if (fi.getString() != null) try { current.setCoursePostDate(df.parse(fi.getString())); } catch (Exception e) { logger.error(e); }
+ }
+ else if ("mgrApprvl".equals(fi.getFieldName())) {
+ if (fi.getString() != null) try { current.setCourseRequiresManagerApproval(Integer.parseInt(fi.getString())>0); } catch (Exception e) { logger.error(e); }
+ }
+ else if ("quickView".equals(fi.getFieldName())) {
+ if (fi.getString() != null) try { current.setCourseQuickView(Integer.parseInt(fi.getString())>0); } catch (Exception e) { logger.error(e); }
+ }
+ else if ("type".equals(fi.getFieldName())) {
+ if (fi.getString() != null) try { current.setCourseTypeID(Integer.parseInt(fi.getString())); } catch (Exception e) { logger.error(e); }
+ }
+ else if ("locURL".equals(fi.getFieldName())) {
+ if (fi.getString() != null) current.setCourseURL(fi.getString());
+ }
+ else if ("mins".equals(fi.getFieldName())) {
+ if (fi.getString() != null) try { current.setCourseSeatMinutes(Integer.parseInt(fi.getString())); } catch (Exception e) { logger.error(e); }
+ }
+ else if ("pass".equals(fi.getFieldName())) {
+ if (fi.getString() != null) try { current.setCoursePass(Integer.parseInt(fi.getString())); } 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); }
+ }
+ else if ("certgen".equals(fi.getFieldName())) {
+ if (fi.getString() != null) try { current.setCourseCertificateGenerator(fi.getString()); } catch (Exception e) { logger.error(e); }
+ }
+ else if ("passreassign".equals(fi.getFieldName())) {
+ if (fi.getString() != null) try { current.setCourseReassignBeforeDays(Integer.parseInt(fi.getString())); } catch (Exception e) { logger.error(e); }
+ }
+ else if ("cert".equals(fi.getFieldName())) {
+ if (fi.getString() != null) cert =fi.getString();
+ }
+ }
+ }
+ }
+ catch (Exception e) { logger.error(e);}
+
+ if ((current.getCourseNum() == null) || (current.getCourseNum().length() < 1))
+ validError = "You must supply a Course Number";
+ else if ((current.getCourseName() == null) || (current.getCourseName().length() < 1))
+ validError = "You must supply a Course Name";
+ else if ((current.getCourseURL() == null) || (current.getCourseURL().length() < 1))
+ validError = "You must supply a URL/File Path";
+ else {
+ if (orig.getCourseID()>0)
+ current.save(ilsSession, orig);
+ else current = current.saveNew(ilsSession);
+
+ // see if we have a file to upload
+ try {
+ for (int i = 0; i < fileItems.size(); i++) {
+ FileItem fi = (FileItem)fileItems.get(i);
+ if (!fi.isFormField()) {
+ // filename on the client
+ String fileName = fi.getName();
+ if ((fileName != null) && (fileName.length() > 1)) {
+ int fStart = fileName.lastIndexOf('\\');
+ if (fStart < 0) fStart = fileName.lastIndexOf('/');
+ if (fStart > 0) fileName = fileName.substring(fStart+1);
+ String fName = "resources/checkList_"+Integer.toString(current.getCompanyID()) + "_" + Integer.toString(current.getCourseID()) +"_" + fileName;
+ File upFile = new File(session.getServletContext().getRealPath(fName));
+ fi.write(upFile);
+ // must save again. We have to do this after the first save because we include the courseID in the
+ // checlist name. We don't know the courseID, if we're a new course, until after we saveNew
+ orig = (Course)current.clone();
+ current.setCourseChecklistURL(fName);
+ // we can't be new at this point, so just save()
+ current.save(ilsSession, orig);
+ }
+ }
+ }
+ }
+ catch (Exception e) { logger.error(e); }
+
+
+ if ((cert != null) && (Integer.parseInt(cert) != currentComplianceID) && (Integer.parseInt(cert) > -1)) {
+ Compliance.deleteCourseCompliancies(ilsSession, current.getCourseID());
+ Compliance.addCourseCompliance(ilsSession, current.getCourseID(), Integer.parseInt(cert));
+ }
+
+ courseID = Integer.toString(current.getCourseID());
+ tmp = Compliance.getCourseCompliancies(ilsSession, current.getCourseID());
+ currentComplianceID = ((tmp != null) && (tmp.size()>0)) ? ((Compliance)tmp.get(0)).getComplianceID() : -1;
+ statusMsg = "Your changes have been saved.";
+ }
+ }
+
+ if ("SaveRoles".equals(action)) {
+ try {
+ Group.deleteCourseGroups(ilsSession, Group.GROUPTYPE_ROLE, current.getCourseID());
+ }
+ catch (Exception e1) { logger.error(e1); }
+ String []roleids = request.getParameterValues("roleid");
+ if (roleids != null) {
+ for (int i = 0; i < roleids.length; i++) {
+ Group.addCourseGroup(ilsSession, Integer.parseInt(roleids[i]), current.getCourseID());
+ }
+ }
+ statusMsg = "Your changes have been saved.";
+ }
+
+ Vector certs = Compliance.getAllCompliancies(ilsSession);
+
+%>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <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" src="js/jquery/jquery.min.js"></script>
+
+<style>
+
+.almostFull {
+ color : red;
+}
+
+</style>
+
+ <script type="text/javascript" language="JavaScript">
+//<!--
+function rD(val) {
+ document.coursesave.activeDate.value = val;
+}
+function rC(val) {
+ document.coursesave.locURL.value = 'courses/'+val;
+}
+
+function confirmRevoke() {
+ if (confirm("Running this routine will assign this course as recurrent training to all applicable users. Are you sure?")) {
+ document.getElementById("sysMaintAction").value = 'revokeExpCourses';
+ document.sysmaint.submit();
+ }
+}
+
+function updateRemainingDescription() {
+ var limit = 500;
+ var d = $('#courseDescription').val();
+ if (d.length > limit) { d = d.substring(0,limit); $('#courseDescription').val(d); }
+ if (d.length >= (limit-100)) $('#remainingDescription').addClass('almostFull');
+ else $('#remainingDescription').removeClass('almostFull');
+ $('#remainingDescription').html((limit-d.length) + ' Remaining ');
+}
+
+$(document).ready(function() {
+ updateRemainingDescription();
+ $('#courseDescription').on('change keyup paste', updateRemainingDescription);
+})
+
+
+// -->
+
+
+
+</script>
+ </head>
+
+ <body>
+<%@ include file="header.jsp" %>
+ <div id="pageContainer">
+<%@ include file="menu.jsp" %>
+<div id="content">
+ <div id="pageTitles">
+ Course Management<br/>
+ <span class="instructiontxt"><%= statusMsg %></span>
+ <span class="instructiontxt"><%= validError %></span>
+ </div>
+ <br>
+ <table cellpadding="0" cellspacing="0" id="tableForm">
+<tr>
+ <th><%=(courseID==null)?"New" : "Edit"%> Course</th>
+ </tr>
+ <tr>
+ <td><form name="coursesave" method="post" action="admin_coursenew.jsp" enctype="multipart/form-data">
+ <input type="hidden" name="action" value="Save"/>
+ <input type="hidden" name="courseid" value="<%=courseID%>"/>
+ <table id="tableFormData">
+ <tr>
+ <td class="formHeadings" style="padding-top:3px">Course No. :</td>
+ <td style="padding-top:3px"><input name="num" type="text" value="<%=current.getCourseNum()%>" size="40"/></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Course Name :</td>
+ <td><input name="name" type="text" value="<%=current.getCourseName()%>" size="40"/> </td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Course Description :<br/><span id="remainingDescription">500 Remaining </span></td>
+ <td><textarea id="courseDescription" style="width:100%" name="desc" rows="7" cols="40"><%=current.getCourseDesc()%></textarea></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Active Date : </td>
+ <%
+ Date postDate = current.getCoursePostDate();
+ if (postDate == null) postDate = new Date();
+%>
+ <td><input style="width:100%" name="activeDate" type="text" value="<%=df.format(postDate)%>" size="12"/>
+ <a href="#" onClick="showCal(document.coursesave.activeDate.value);return false;"><img border="0" src="images/calendar_btn.gif" width="18" height="18" alt=""/></a></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Status :</td>
+ <td><select name="statusID">
+ <option value="1" <%=(current.isCourseActive())?"selected=\"true\"":""%>>Active</option>
+ <option value="0" <%=(!current.isCourseActive())?"selected=\"true\"":""%>>Inactive</option>
+ </select></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Display Course in Course Catalog :</td>
+ <td><select name="ipRestrict">
+ <option value="F" <%=(!"I".equals(current.getCourseIPRestricted()) && !"N".equals(current.getCourseIPRestricted()))?"selected=\"true\"":""%>>To All IP Addresses</option>
+ <option value="I" <%=("I".equals(current.getCourseIPRestricted()))?"selected=\"true\"":""%>>Only To Restricted IP Addresses</option>
+ <option value="N" <%=("N".equals(current.getCourseIPRestricted()))?"selected=\"true\"":""%>>Only To Non-Restricted IP Addresses</option>
+ </select></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Display in :</td>
+ <td><select name="quickView">
+ <option value="0" <%=(!current.isCourseQuickView())?"selected=\"true\"":""%>>Course Catalog</option>
+ <option value="1" <%=(current.isCourseQuickView())?"selected=\"true\"":""%>>Quick View</option>
+ </select> </td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Type :</td>
+ <td><select name="type">
+ <option value="1" <%=(current.getCourseTypeID()==1)?"selected=\"true\"":""%>>AICC / HACP</option>
+ <option value="2" <%=(current.getCourseTypeID()==2)?"selected=\"true\"":""%>>eXpress course</option>
+ </select></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">URL / File Path: </td>
+ <td><table>
+ <tr>
+ <td><input name="locURL" type="text" value="<%=current.getCourseURL()%>" size="40"/> </td>
+ <td width="52"><table width="21%" border="0">
+ <tr>
+ <td width="12%"><a href="#" onClick="showList(1, 'courses');return false;"><img border="0" src="images/browse_btn.gif" width="24" height="24" alt=""/></a></td>
+ <td width="88%"><a href="#" class="formButtons" onClick="showList(1, 'courses');return false;">Browse</a></td>
+ </tr>
+ </table></td>
+ </tr>
+ </table></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Certification:</td>
+ <td><table>
+ <tr>
+ <td width="130"><select name="cert">
+ <option <%=(currentComplianceID == -1) ? "selected=\"selected\"":""%> value="-1">Select Certification</option>
+ <%
+ for (int i = 0; i < certs.size(); i++) {
+ Compliance cert = (Compliance)certs.get(i);
+%>
+ <option value="<%=cert.getComplianceID()%>" <%=(cert.getComplianceID() == currentComplianceID)?"selected=\"true\"":""%>><%=cert.getComplianceName()%></option>
+ <%
+ }
+%>
+ </select> </td>
+ <td><table>
+ <tr>
+ <td width="12%"><a href="admin_complianceedit.jsp"><img border="0" src="images/Add.gif" width="24" height="24" alt=""/></a></td>
+ <td width="88%"><a href="admin_complianceedit.jsp" class="formButtons">Add Certification</a></td>
+ </tr>
+ </table></td>
+ </tr>
+ </table></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Seat Minutes : </td>
+ <td><input name="mins" type="text" value="<%=current.getCourseSeatMinutes()%>" size="6"/> </td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Passing Score : </td>
+ <td><input name="pass" type="text" value="<%=current.getCoursePass()%>" size="6"/> % </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 curriculum_certificate.jsp" value="<%=current.getCourseCertificateGenerator()%>" size="40"/></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Course Certificate Expires After </td>
+ <td><input name="passexp" type="text" value="<%=current.getCoursePassExpireDays()%>" size="6"/> Days</td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Reassign As Recurrent Training </td>
+ <td><input name="passreassign" type="text" value="<%=current.getCourseReassignBeforeDays()%>" size="6"/> Days Before Expiration</td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Reassign Now As Recurrent Training To All Applicable Users</td>
+ <td><a href="#" onClick="confirmRevoke(); return false;"><img border="0" src="images/run_btn.gif" width="51" height="24" alt="Perform Action"/></a></td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Requires Management Approval for Completion: </td>
+ <td colspan="2">
+ <select name="mgrApprvl">
+ <option value="0" <%=(!current.isCourseRequiresManagerApproval())?"selected=\"true\"":""%>>No</option>
+ <option value="1" <%=(current.isCourseRequiresManagerApproval())?"selected=\"true\"":""%>>Yes</option>
+ </select> </td>
+ </tr>
+ <tr>
+
+
+
+ <td class="formHeadings">Approval Checklist: </td>
+ <td>
+
+ <% if ((current.getCourseChecklistURL() != null) && (current.getCourseChecklistURL().length() > 0)) { %>
+
+ <table>
+ <tr>
+ <td width="52"><table width="21%" border="0">
+ <tr>
+ <td width="12%"><a href="#" onClick="window.open('<%=current.getCourseChecklistURL()%>','Resource','width=800,height=600');return false;"><img border="0" src="images/browse_btn.gif" width="20" height="20" alt=""/></a></td>
+ <td width="88%"><a href="#" class="formButtons" onClick="window.open('<%=current.getCourseChecklistURL()%>','Resource','width=800,height=600');return false;">View Checklist</a></td>
+ </tr>
+ </table></td>
+ </tr>
+ </table>
+
+ <% } else { %>
+
+ None Uploaded
+
+ <% } %>
+
+ </td>
+ </tr>
+ <tr>
+ <td class="formHeadings">Upload Approval Checklist : </td>
+ <td><input name="file" type="file" size="40" /></td>
+ </tr>
+ <tr>
+ <td class="formHeadings"> </td>
+ <td colspan="2"><a href="#" onClick="document.coursesave.submit()"><br>
+ <img border="0" src="images/save_btn.gif" width="68" height="24" hspace="3" alt=""/></a><a href="admin_coursemanagement.jsp"><img border="0" src="images/cancel_btn.gif" width="72" height="24" alt=""/></a></td>
+ </tr>
+ </table>
+ </form></td>
+ </tr>
+ </table>
+ <br/>
+<%
+if (current.getCourseID() > 0) {
+ Vector roles = Group.getAllGroups(ilsSession, Group.GROUPTYPE_ROLE);
+
+ final String sort = request.getParameter("sort");
+
+ if (sort != null) {
+ if (roles != null) {
+ java.util.Collections.sort(roles, new Comparator() {
+ public int compare(Object o1, Object o2) {
+ if ("name".equals(sort)) {
+ return ((Group)o1).getGroupName().compareTo(((Group)o2).getGroupName());
+ }
+ if ("desc".equals(sort)) {
+ return ((Group)o1).getGroupDesc().compareTo(((Group)o2).getGroupDesc());
+ }
+ return 0;
+ }
+ });
+ }
+ }
+ Vector tmp2 = Group.getCourseGroups(ilsSession, current.getCourseID());
+ Vector inCourse = new Vector();
+ for (int i = 0; i < tmp2.size(); i++) {
+ inCourse.add(new Integer(((Group)tmp2.get(i)).getGroupID()));
+ }
+%>
+<form name="courserolesave" method="post" action="admin_coursenew.jsp">
+ <input type="hidden" name="action" value="SaveRoles"/>
+ <input type="hidden" name="courseid" value="<%=courseID%>"/>
+
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" class="tableMain">
+ <tr>
+ <th><t:t>Assigned to Roles</t:t></th>
+ </tr>
+ <tr>
+ <td class="tableBTN">
+ <table width="196" border="0" align="left">
+ <tr>
+ <td width="90">
+ <table width="90" border="0">
+ <tr>
+ <td width="12%"><a href="#" onClick="document.courserolesave.submit()"><img border="0" src="images/saveicon_btn.gif" width="24" height="24" alt=""/></a></td>
+ <td width="88%"><a href="#" class="formButtons" onClick="document.courserolesave.submit()">Save</a></td>
+ </tr>
+ </table> </td>
+ <td width="96">
+ <table width="96" border="0">
+ <tr>
+ <td width="12%"><a href="admin_coursemanagement.jsp"><img border="0" src="images/delete_btn.gif" width="24" height="24" alt=""/></a></td>
+ <td width="88%"><a href="admin_coursemanagement.jsp" class="formButtons">Cancel</a></td>
+ </tr>
+ </table> </td>
+ </tr>
+ </table> </td>
+ </tr>
+ <tr>
+ <td>
+ <table class="tableData">
+ <tr>
+ <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>
+<%
+ for (int i = 0; i < roles.size(); i++) {
+ Group role = (Group)roles.get(i);
+ 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><%=role.getGroupName()%></td>
+ <td><%=role.getGroupDesc()%></td>
+ </tr>
+<%
+ }
+%>
+ </table> </td>
+ </tr>
+ </table>
+</form>
+<%
+ }
+%>
+</div>
+
+ <form style="display:none;" name="sysmaint" method="post" action="admin_coursenew.jsp">
+ <input type="hidden" id="sysMaintAction" name="action" value=""/>
+ <input type="hidden" name="courseid" value="<%= current.getCourseID() %>"/>
+ </form>
+
+<%@ include file="footer.jsp" %>
+</div>
+</body>
+</html>
Modified: trunk/webapp/aicc.jsp
===================================================================
--- trunk/webapp/aicc.jsp 2016-01-25 21:43:26 UTC (rev 1387)
+++ trunk/webapp/aicc.jsp 2016-02-03 17:28:21 UTC (rev 1388)
@@ -241,6 +241,18 @@
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) {
+ try {
+ ca.saveCertificate(ca.generateCertificate(ilsSession, request));
+ }
+ catch (Exception e) {
+ logger.error(e, e);
+ }
+ }
+ ca.passAllAssociatedCurriculum(ilsSession);
+ }
sendNotifications(session, ca, course, user);
}
}
Added: trunk/webapp/api/courseattempt/cert/generate/index.jsp
===================================================================
--- trunk/webapp/api/courseattempt/cert/generate/index.jsp (rev 0)
+++ trunk/webapp/api/courseattempt/cert/generate/index.jsp 2016-02-03 17:28:21 UTC (rev 1388)
@@ -0,0 +1,90 @@
+<%@ page
+ language="java"
+ contentType="text/html;charset=utf-8"
+%>
+<%@ page trimDirectiveWhitespaces="true" %>
+<%@ page import="com.resolutions.ils.Utils" %>
+<%@ page import="org.crosswire.utils.HTTPUtils" %>
+<%@ page import="com.resolutions.ils.ILSSession" %>
+<%@ page import="com.resolutions.ils.data.Company" %>
+<%@ page import="com.resolutions.ils.data.CourseAttempt" %>
+<%@ page import="org.apache.log4j.Logger" %>
+
+<%
+ Logger logger = Logger.getLogger(this.getClass());
+ Logger eventsLogger = Logger.getLogger("EVENTS");
+ // standard service header ---------------------------------------
+ response.setContentType("text/xml");
+ int errCode = 0;
+ Company company = Company.getCompany(request);
+
+ boolean apiEnabled = "on".equals(Utils.getSysConfig(session.getServletContext(), company.getCompanyID()).getProperty("APIEnable", "off"));
+ ++errCode;
+ if (!apiEnabled) {
+ out.print("<error code=\""+errCode+"\" message=\"API not enabled in system management settings.\"/>");
+ return;
+ }
+
+ String userID = request.getParameter("ILSUSER");
+ String userPw = request.getParameter("ILSPASSWD");
+ ILSSession ilsSession = (userID != null && userPw != null)
+ ? ILSSession.login(company.getCompanyName(), userID, userPw)
+ : (ILSSession)session.getAttribute("ilsSession");
+ ++errCode;
+ if (ilsSession == null) {
+ out.print("<error code=\""+errCode+"\" message=\"Your iLS sign in information is not valid.\"/>");
+ return;
+ }
+ // end standard service header -----------------------------------
+
+
+ String errorMsg = "";
+
+ int caid = -1; try { caid = Integer.parseInt(request.getParameter("courseAttemptID")); } catch (Exception e) {}
+
+ String statusMsg = "";
+
+ if (caid != -1) {
+ CourseAttempt ca = CourseAttempt.getCourseAttempt(ilsSession, caid);
+ ++errCode;
+ if (ca == null) {
+%>
+<error code="<%=errCode%>" message="No Course Attempt with ID: <%=caid%>"/>
+<%
+ return;
+ }
+
+ ++errCode;
+ try {
+ byte[] certData = ca.generateCertificate(ilsSession, request);
+ response.setContentType("application/pdf");
+ response.getOutputStream().write(certData, 0, certData.length);
+ response.getOutputStream().flush();
+ return;
+ }
+ catch (Exception e) {
+ response.setContentType("text/xml");
+%>
+<error code="<%=errCode%>" message="<%=HTTPUtils.canonize(e.toString())%>"/>
+<%
+ return;
+ }
+ }
+
+ response.setContentType("text/html");
+%>
+<html>
+<style>th { text-align:left; }</style>
+<body>
+<h1>courseattempt/cert/generate</h1>
+<p>Generate a certificate for a Course Attempt</p>
+<h3>Parameters</h3>
+<table border="1">
+<tbody>
+<tr><th>courseAttemptID</th><td>courseAttemptID from which to retrieve a saved certificate</td></tr>
+<tr><th>ILSUSER</th><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+<tr><th>ILSPASSWD</th><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+</tbody>
+<table>
+</body>
+</html>
Added: trunk/webapp/api/courseattempt/cert/get/index.jsp
===================================================================
--- trunk/webapp/api/courseattempt/cert/get/index.jsp (rev 0)
+++ trunk/webapp/api/courseattempt/cert/get/index.jsp 2016-02-03 17:28:21 UTC (rev 1388)
@@ -0,0 +1,82 @@
+<%@ page
+ language="java"
+ contentType="text/html;charset=utf-8"
+%>
+<%@ page trimDirectiveWhitespaces="true" %>
+<%@ page import="com.resolutions.ils.Utils" %>
+<%@ page import="com.resolutions.ils.ILSSession" %>
+<%@ page import="com.resolutions.ils.data.Company" %>
+<%@ page import="com.resolutions.ils.data.CourseAttempt" %>
+<%@ page import="java.util.Vector" %>
+<%@ page import="org.apache.log4j.Logger" %>
+<%
+ // standard service header ---------------------------------------
+ response.setContentType("text/xml");
+ int errCode = 0;
+ Company company = Company.getCompany(request);
+
+ boolean apiEnabled = "on".equals(Utils.getSysConfig(session.getServletContext(), company.getCompanyID()).getProperty("APIEnable", "off"));
+ ++errCode;
+ if (!apiEnabled) {
+ out.print("<error code=\""+errCode+"\" message=\"API not enabled in system management settings.\"/>");
+ return;
+ }
+
+ String userID = request.getParameter("ILSUSER");
+ String userPw = request.getParameter("ILSPASSWD");
+ ILSSession ilsSession = (userID != null && userPw != null)
+ ? ILSSession.login(company.getCompanyName(), userID, userPw)
+ : (ILSSession)session.getAttribute("ilsSession");
+ ++errCode;
+ if (ilsSession == null) {
+ out.print("<error code=\""+errCode+"\" message=\"Your iLS sign in information is not valid.\"/>");
+ return;
+ }
+ // end standard service header -----------------------------------
+
+
+ String errorMsg = "";
+
+ int caid = -1; try { caid = Integer.parseInt(request.getParameter("courseAttemptID")); } catch (Exception e) {}
+
+ Logger logger = Logger.getLogger(this.getClass());
+ Logger eventsLogger = Logger.getLogger("EVENTS");
+ String statusMsg = "";
+
+ if (caid != -1) {
+ CourseAttempt ca = CourseAttempt.getCourseAttempt(ilsSession, caid);
+ ++errCode;
+ if (ca == null) {
+ out.print("<error code=\""+errCode+"\" message=\"No Course Attempt with ID: " + caid + "\"/>");
+ return;
+ }
+
+ byte[] certData = ca.getSavedCertificate();
+ ++errCode;
+ if (certData == null) {
+ out.print("<error code=\""+errCode+"\" message=\"No Save Certificate for Course Attempt with ID: " + caid + "\"/>");
+ return;
+ }
+ response.setContentType("application/pdf");
+ response.getOutputStream().write(certData, 0, certData.length);
+ response.getOutputStream().flush();
+ return;
+ }
+
+ response.setContentType("text/html");
+%>
+<html>
+<style>th { text-align:left; }</style>
+<body>
+<h1>courseattempt/cert/get</h1>
+<p>Retrieve a saved certificate</p>
+<h3>Parameters</h3>
+<table border="1">
+<tbody>
+<tr><th>courseAttemptID</th><td>courseAttemptID from which to retrieve a saved certificate</td></tr>
+<tr><th>ILSUSER</th><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+<tr><th>ILSPASSWD</th><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+</tbody>
+<table>
+</body>
+</html>
Modified: trunk/webapp/certificate.jsp
===================================================================
--- trunk/webapp/certificate.jsp 2016-01-25 21:43:26 UTC (rev 1387)
+++ trunk/webapp/certificate.jsp 2016-02-03 17:28:21 UTC (rev 1388)
@@ -6,8 +6,6 @@
<%@ page import="com.resolutions.ils.data.*" %>
<%@ page import="java.util.Vector" %>
<%@ page import="java.util.Date" %>
-<%@ page import="java.io.File" %>
-<%@ page import="java.net.URL" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
Modified: trunk/webapp/certificate_curriculum.jsp
===================================================================
--- trunk/webapp/certificate_curriculum.jsp 2016-01-25 21:43:26 UTC (rev 1387)
+++ trunk/webapp/certificate_curriculum.jsp 2016-02-03 17:28:21 UTC (rev 1388)
@@ -7,8 +7,6 @@
<%@ page import="java.util.Vector" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Date" %>
-<%@ page import="java.io.File" %>
-<%@ page import="java.net.URL" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
ILSSession ilsSession = (ILSSession)session.getAttribute("ilsSession");
@@ -16,19 +14,30 @@
out.print("<html><head><META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=login.jsp\"></head></html>");
return;
}
- int cID = -1;
- try {
- cID = Integer.parseInt(request.getParameter("c"));
- }
- catch (Exception e) {}
- if (cID < 0) {
+// So, this now allows us to get the curriculum and user in a number of ways. Ideally, moving forward,
+// since we are saving a Course Attempt record now when a curriculum is complete, we will get the
+// Curriculum and User from the Course Attempt record.
+//
+// But... so that we can work the old way, we allow the Curriculum to be passed in directly, as before
+// with the 'c' parameter. This has other problems, as this assumes that we want the currently logged
+// in user's information about this curriculum, but this is not true any longer because an admin can
+// ask for a certificate for a specific user now. So, we also allow the User Profile ID to be passed
+// in with the 'up' parameter. I don't think anyone is using this yet and no one ever should because if
+// they are going to change anything to make things work correctly, they should change to use Course
+// Attempt :)
+//
+ int caID = -1; try { caID = Integer.parseInt(request.getParameter("ca")); } catch (Exception e) {}
+ int cID = -1; try { cID = Integer.parseInt(request.getParameter("c")); } catch (Exception e) {}
+ int upID = -1; try { upID = Integer.parseInt(request.getParameter("up")); } catch (Exception e) {}
+
+ if (caID < 0 && cID < 0) {
out.print("<html><body><h1>Invalid Request</h1></body></html>");
return;
}
-// CourseAttempt ca = CourseAttempt.getCourseAttempt(ilsSession, caID);
- Course cc = Course.getCourse(ilsSession, cID);
- UserProfile up = ilsSession.getCurrentUserProfile();
+ CourseAttempt ca = caID > -1 ? CourseAttempt.getCourseAttempt(ilsSession, caID) : null;
+ Course cc = Course.getCourse(ilsSession, ca != null ? ca.getCourseAttemptCourseID() : cID);
+ UserProfile up = UserProfile.getUserProfile(ilsSession, ca != null ? ca.getCourseAttemptUserProfileID() : upID > -1 ? upID : ilsSession.getCurrentUserProfile().getUserProfileID());
SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
@@ -186,7 +195,6 @@
%>
<!-- End Check Full Address -->
<!-- Start Get Course End Date -->
- <% UserProfile user = ilsSession.getCurrentUserProfile(); %>
<%!
public static String GetCourseEndDate(HttpSession session, ILSSession ilsSession, UserProfile user, int CourseID)
{
@@ -264,7 +272,7 @@
<tr>
<td>(b)(1) Introduction to the work environment, mine tour, mining method/operation - Online training</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 15) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 15) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>10 Min</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -272,7 +280,7 @@
<tr>
<td>(b)(2) Instruction on recognition and avoidance of electrical and other hazards</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 28) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 28) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>4 Hrs<br/>42 Min</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -280,7 +288,7 @@
<tr>
<td>(b)(3) Emergency procedures, escape, and firefighting</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 6) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 6) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>18 Min</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -296,7 +304,7 @@
<tr>
<td>(b)(4) Health and Safety aspects of the tasks assigned - Online training</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 5) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 5) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>34 Min</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -304,7 +312,7 @@
<tr>
<td>(b)(5) Instruction on statutory rights of miners and their representatives</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 7) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 7) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>32 Min</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -312,7 +320,7 @@
<tr>
<td>(b)(6) Authority & responsibility of supervisors and miners' representatives</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 8) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 8) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>2 Min</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -320,7 +328,7 @@
<tr>
<td>(b)(7) Introduction to you rules and procedures for reporting hazards</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 9) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 9) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>58 Min</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -339,7 +347,7 @@
<tr>
<td>Emergency plans, and firefighting</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 10) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 10) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>6 Min</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -350,7 +358,7 @@
<tr>
<td>Hazcom</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 11) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 11) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>44 Min</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -440,7 +448,7 @@
<tr>
<td>Instruction on changes at the mine that could adversely affect the miner's health or safety</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 29) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 29) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>9 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -448,7 +456,7 @@
<tr>
<td>H & S standards and applicable requirements</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 30) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 30) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>1 hour<br/>27 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -459,7 +467,7 @@
<tr>
<td>Transportation controls and communication systems</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 31) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 31) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>2 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -467,7 +475,7 @@
<tr>
<td>Emergency plans, and firefighting</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 32) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 32) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>17 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -475,7 +483,7 @@
<tr>
<td>Ground conditions and control</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 33) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 33) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>2 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -483,7 +491,7 @@
<tr>
<td>Working in areas of highwalls</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 34) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 34) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>6 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -491,7 +499,7 @@
<tr>
<td>Water hazards, pits, and spoil banks</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 35) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 35) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>4 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -499,7 +507,7 @@
<tr>
<td>Basic First-aid/ CPR</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 36) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 36) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>7 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -507,7 +515,7 @@
<tr>
<td>Accident Prevention</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 37) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 37) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>3 hours<br/>23 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -515,7 +523,7 @@
<tr>
<td>Mobile Equipment</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 38) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 38) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>7 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -523,7 +531,7 @@
<tr>
<td>Health</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 39) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 39) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>35 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -531,7 +539,7 @@
<tr>
<td>Maintenance & Repair, Material Handling, Fall protection</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 40) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 40) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>31 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -539,7 +547,7 @@
<tr>
<td>Electrical hazards</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 41) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 41) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>26 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
@@ -547,7 +555,7 @@
<tr>
<td>Hazcom</td>
<td></td>
- <td><%= GetCourseEndDate(session, ilsSession, user, 42) %></td>
+ <td><%= GetCourseEndDate(session, ilsSession, up, 42) %></td>
<td style="text-align:center;"><% if (FullAddress) { %><%= Addr1 + "<br/>" + Addr2 + "<br/>" + City + ", " + State + " " + Zip + ", " + Country %><% } else { %><span style="color: #d9d9d9; font-weight: bold;">Enter Location<br/>Name & Address</span><% } %></td>
<td>44 Mins.</td>
<td style="text-align:center;"><span style="color: #d9d9d9; font-weight: bold;">Initial<br/>Here</span></td>
Modified: trunk/webapp/report_employeecourseatt.jsp
===================================================================
--- trunk/webapp/report_employeecourseatt.jsp 2016-01-25 21:43:26 UTC (rev 1387)
+++ trunk/webapp/report_employeecourseatt.jsp 2016-02-03 17:28:21 UTC (rev 1388)
@@ -72,22 +72,37 @@
int cid = -1;
try { cid = Integer.parseInt(cidString); } catch (Exception e) {}
if (reason == null) reason = "";
+ CourseAttempt ca = null;
if (cid > -1) {
CourseAttempt caOrig = CourseAttempt.getCourseAttempt(ilsSession, cid);
if (caOrig != null) {
- CourseAttempt ca = (CourseAttempt)caOrig.clone();
+ ca = (CourseAttempt)caOrig.clone();
ca.setCourseAttemptForcePass(reason);
ca.save(caOrig);
}
}
else {
- CourseAttempt ca = new CourseAttempt();
+ ca = new CourseAttempt();
ca.defaultAll();
ca.setCourseAttemptCourseID(Integer.parseInt(courseIDString));
ca.setCourseAttemptUserProfileID(profileID);
ca.setCourseAttemptForcePass(reason);
ca = ca.saveNew(ilsSession);
}
+ if (ca != null) {
+ Course course = Course.getCourse(ilsSession, ca.getCourseAttemptCourseID());
+ String certgen = course.getCourseCertificateGenerator();
+ if (certgen != null && certgen.trim().length() > 0) {
+ try {
+ ca.saveCertificate(ca.generateCertificate(ilsSession, request));
+ }
+ catch (Exception e) {
+ logger.error(e, e);
+ }
+ }
+
+ ca.passAllAssociatedCurriculum(ilsSession);
+ }
}
@@ -261,6 +276,7 @@
<th>Start Date </th>
<th>End Date</th>
<th>Score %</th>
+ <th>Cert</th>
</tr>
<%
for (int j = 0; j < courseAttempts.size(); j++) {
@@ -311,6 +327,11 @@
<td> <%=startDate%> </td>
<td> <%=endDate %> </td>
<td> <%=ca.getStringValue("score")%> </td>
+ <td>
+<% if (ca.getSavedCertificate() != null) { %>
+<a target="_blank" href="api/courseattempt/cert/get?courseAttemptID=<%=ca.getCourseAttemptID()%>"><img src="images/certificate_saved.png"/></a>
+<% } %>
+ </td>
</tr>
<%
}
More information about the Ils-source
mailing list