diff --git a/iTrust/WebRoot/auth/admin/reminderMessage.jsp b/iTrust/WebRoot/auth/admin/reminderMessage.jsp new file mode 100644 index 0000000000000000000000000000000000000000..a9f7df9ab5a859a62572af8d38293722c7f4d7ea --- /dev/null +++ b/iTrust/WebRoot/auth/admin/reminderMessage.jsp @@ -0,0 +1,74 @@ +<%@page errorPage="/auth/exceptionHandler.jsp"%> + +<%@page import="edu.ncsu.csc.itrust.action.ViewMyMessagesAction"%> +<%@page import="edu.ncsu.csc.itrust.beans.MessageBean"%> +<%@page import="java.util.List"%> + +<%@include file="/global.jsp" %> + +<% +pageTitle = "iTrust - View Message"; +%> + +<%@include file="/header.jsp" %> + +<% + ViewMyMessagesAction action = new ViewMyMessagesAction(prodDAO, loggedInMID.longValue()); + MessageBean original = null; + + loggingAction.logEvent(TransactionType.OUTBOX_VIEW, loggedInMID.longValue(), 0, ""); + + if (request.getParameter("msg") != null) { + String msgParameter = request.getParameter("msg"); + int msgIndex = 0; + try { + msgIndex = Integer.parseInt(msgParameter); + } catch (NumberFormatException nfe) { + response.sendRedirect("viewReminderOutbox.jsp"); + } + List<MessageBean> messages = null; + if (session.getAttribute("messages") != null) { + messages = (List<MessageBean>) session.getAttribute("messages"); + if(msgIndex > messages.size() || msgIndex < 0) { + msgIndex = 0; + response.sendRedirect("oops.jsp"); + } + } else { + response.sendRedirect("viewReminderOutbox.jsp"); + } + original = (MessageBean)messages.get(msgIndex); + session.setAttribute("message", original); + } + else { + response.sendRedirect("viewReminderOutbox.jsp"); + } + +%> + <div> + <table width="99%"> + <tr> + <td><b>To:</b> <%= StringEscapeUtils.escapeHtml("" + ( action.getName(original.getTo()) )) %></td> + </tr> + <tr> + <td><b>Subject:</b> <%= StringEscapeUtils.escapeHtml("" + ( original.getSubject() )) %></td> + </tr> + <tr> + <td><b>Date & Time:</b> <%= StringEscapeUtils.escapeHtml("" + ( original.getSentDate() )) %></td> + </tr> + </table> + </div> + + <table> + <tr> + <td colspan="2"><b>Message:</b></td> + </tr> + <tr> + <td colspan="2"><%= StringEscapeUtils.escapeHtml("" + ( original.getBody() )).replace("\n","<br/>") %></td> + </tr> + <tr> + <td colspan="2"><a href="viewReminderOutbox.jsp">Back</a></td> + </tr> + </table> + + +<%@include file="/footer.jsp" %> \ No newline at end of file diff --git a/iTrust/WebRoot/auth/admin/sendAppointmentReminders.jsp b/iTrust/WebRoot/auth/admin/sendAppointmentReminders.jsp new file mode 100644 index 0000000000000000000000000000000000000000..711032f0c4cf478d0a95bbc755bf61860e04bec0 --- /dev/null +++ b/iTrust/WebRoot/auth/admin/sendAppointmentReminders.jsp @@ -0,0 +1,50 @@ + +<%@taglib prefix="itrust" uri="/WEB-INF/tags.tld"%> +<%@page errorPage="/auth/exceptionHandler.jsp"%> +<%@page import="edu.ncsu.csc.itrust.action.SendRemindersAction" %> +<%@page import="edu.ncsu.csc.itrust.exception.ITrustException" %> +<%@page import="java.lang.NumberFormatException" %> + +<%@include file="/global.jsp" %> + +<% +pageTitle = "iTrust - Send Reminder Message"; +%> + +<%@include file="/header.jsp" %> + +<% + String input = request.getParameter("withinDays"); + if (input != null && !input.equals("")) { + try { + int days = Integer.valueOf(input); + if (days <= 0) { +%> + <span class="iTrustError"><%=StringEscapeUtils.escapeHtml("Provide a positive number") %></span> +<% + } + else { + SendRemindersAction action = new SendRemindersAction(prodDAO, loggedInMID.longValue()); + action.sendReminderForAppointments(days); +%> + <span class="iTrustMessage"><%=StringEscapeUtils.escapeHtml("Reminders were successfully sent") %></span> +<% + } + + } catch (NumberFormatException | ITrustException e) { +%> + <span class="iTrustError"><%=StringEscapeUtils.escapeHtml("Reminders failed to send. Please provide a positive number") %></span> +<% + } + } +%> + +<div class="page-header"><h1>Send Reminder Message</h1></div> + +<form method="post"> +<h4> Send reminders to all patients with an appointment within the next n days. Provide n: </h4> +<input type="text" name="withinDays"></td> +<input type="submit" style="font-size: 12pt; font-weight: bold;" value="Send Appointment Reminders"> +</form> + +<%@include file="/footer.jsp" %> \ No newline at end of file diff --git a/iTrust/WebRoot/auth/admin/viewReminderOutbox.jsp b/iTrust/WebRoot/auth/admin/viewReminderOutbox.jsp new file mode 100644 index 0000000000000000000000000000000000000000..d2f2618da93dbc02f634568a57b81f0081a924f4 --- /dev/null +++ b/iTrust/WebRoot/auth/admin/viewReminderOutbox.jsp @@ -0,0 +1,71 @@ +<%@page errorPage="/auth/exceptionHandler.jsp"%> + +<%@page import="java.util.List"%> + +<%@page import="edu.ncsu.csc.itrust.action.ViewMyMessagesAction"%> +<%@page import="edu.ncsu.csc.itrust.beans.MessageBean"%> +<%@page import="edu.ncsu.csc.itrust.dao.DAOFactory"%> + +<%@include file="/global.jsp" %> + +<% +pageTitle = "iTrust - View My Sent Messages"; +%> + +<%@include file="/header.jsp" %> + +<div align=center> + <h2>Sent Reminders</h2> + <% + loggingAction.logEvent(TransactionType.OUTBOX_VIEW, loggedInMID.longValue(), loggedInMID.longValue(), ""); + + ViewMyMessagesAction action = new ViewMyMessagesAction(prodDAO, 9000000009L); + List<MessageBean> messages = null; + if(request.getParameter("sortby") != null) { + if(request.getParameter("sortby").equals("name")) { + if(request.getParameter("sorthow").equals("asce")) { + messages = action.getAllMySentMessagesNameAscending(); + } else { + messages = action.getAllMySentMessagesNameDescending(); + } + } else if(request.getParameter("sortby").equals("time")) { + if(request.getParameter("sorthow").equals("asce")) { + messages = action.getAllMySentMessagesTimeAscending(); + } else { + messages = action.getAllMySentMessages(); + } + } + } + else { + messages = action.getAllMySentMessages(); + } + session.setAttribute("messages", messages); + if (messages.size() > 0) { %> + <br /> + <table class="fancyTable"> + <tr> + <th>To</th> + <th>Subject</th> + <th>Sent</th> + <th></th> + </tr> + <% int index = 0; %> + <% for(MessageBean message : messages) { %> + <tr <%=(index%2 == 1)?"class=\"alt\"":"" %>> + <td><%= StringEscapeUtils.escapeHtml("" + ( action.getName(message.getTo()) )) %></td> + <td><%= StringEscapeUtils.escapeHtml("" + ( message.getSubject() )) %></td> + <td><%= StringEscapeUtils.escapeHtml("" + ( message.getSentDate() )) %></td> + <td><a href="reminderMessage.jsp?msg=<%= StringEscapeUtils.escapeHtml("" + ( index )) %>">Read</a></td> + </tr> + <% index ++; %> + <% } %> + </table> + <% } else { %> + <div> + <i>No reminders sent</i> + </div> + <% } %> + <br /> +</div> + +<%@include file="/footer.jsp" %> \ No newline at end of file diff --git a/iTrust/WebRoot/auth/hcp-pha/viewEpidemics.jsp b/iTrust/WebRoot/auth/hcp-pha/viewEpidemics.jsp index 1d9d99ecd40b3e3e0e73a9ee5c155f2e767a75af..dd1e1dd96756024f214b13c267bc0b9b34bf3157 100644 --- a/iTrust/WebRoot/auth/hcp-pha/viewEpidemics.jsp +++ b/iTrust/WebRoot/auth/hcp-pha/viewEpidemics.jsp @@ -101,7 +101,7 @@ <% if (dsBean != null && avgBean != null) { %> <p style="display:block; margin-left:auto; margin-right:auto; width:600px;"> -<%@include file="DiagnosisEpidemicsChart.jsp" %> + </p> <% diff --git a/iTrust/iTrust.iml b/iTrust/iTrust.iml deleted file mode 100644 index c1ff8d3cd59969e529825f9c34c90cd438d50356..0000000000000000000000000000000000000000 --- a/iTrust/iTrust.iml +++ /dev/null @@ -1,115 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> - <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8"> - <output url="file://$MODULE_DIR$/target/classes" /> - <output-test url="file://$MODULE_DIR$/target/test-classes" /> - <content url="file://$MODULE_DIR$"> - <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" /> - <excludeFolder url="file://$MODULE_DIR$/target" /> - </content> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-java:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-android-driver:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-chrome-driver:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-htmlunit-driver:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-api:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: org.json:json:20080701" level="project" /> - <orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit:2.9" level="project" /> - <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.1.2" level="project" /> - <orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit-core-js:2.9" level="project" /> - <orderEntry type="library" name="Maven: net.sourceforge.cssparser:cssparser:0.9.5" level="project" /> - <orderEntry type="library" name="Maven: org.w3c.css:sac:1.3" level="project" /> - <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.1.2" level="project" /> - <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.1.2" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-firefox-driver:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-ie-driver:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: net.java.dev.jna:platform:3.4.0" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-iphone-driver:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-safari-driver:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-support:2.25.0" level="project" /> - <orderEntry type="library" name="Maven: org.webbitserver:webbit:0.4.6" level="project" /> - <orderEntry type="library" name="Maven: org.jboss.netty:netty:3.2.7.Final" level="project" /> - <orderEntry type="library" name="Maven: org.apache.james:apache-mime4j:0.6" level="project" /> - <orderEntry type="library" name="Maven: bsh:bsh:1.3.0" level="project" /> - <orderEntry type="library" name="Maven: cglib:cglib-nodep:2.2" level="project" /> - <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.9" level="project" /> - <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" /> - <orderEntry type="library" name="Maven: org.apache.commons:commons-exec:1.1" level="project" /> - <orderEntry type="library" name="Maven: commons-io:commons-io:2.4" level="project" /> - <orderEntry type="library" name="Maven: commons-jxpath:commons-jxpath:1.3" level="project" /> - <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.3.2" level="project" /> - <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.3" level="project" /> - <orderEntry type="library" name="Maven: cssparser:cssparser:0.9.4" level="project" /> - <orderEntry type="library" name="Maven: findbugs:findbugs:1.0.0" level="project" /> - <orderEntry type="library" name="Maven: findbugs:annotations:1.0.0" level="project" /> - <orderEntry type="library" name="Maven: bcel:bcel:5.1" level="project" /> - <orderEntry type="library" name="Maven: regexp:regexp:1.2" level="project" /> - <orderEntry type="library" name="Maven: findbugs:coreplugin:1.0.0" level="project" /> - <orderEntry type="library" name="Maven: findbugs:findbugs-ant:1.0.0" level="project" /> - <orderEntry type="library" name="Maven: findbugs:findbugsGUI:1.0.0" level="project" /> - <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.3.1" level="project" /> - <orderEntry type="library" name="Maven: com.google.guava:guava:site:18.0" level="project" /> - <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" /> - <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" /> - <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.2" level="project" /> - <orderEntry type="library" name="Maven: com.beust:jcommander:1.29" level="project" /> - <orderEntry type="library" name="Maven: org.eclipse.jetty.aggregate:jetty-websocket:8.1.8.v20121106" level="project" /> - <orderEntry type="library" name="Maven: net.java.dev.jna:jna:3.4.0" level="project" /> - <orderEntry type="library" name="Maven: net.java.dev.jna:jna-platform:4.0.0" level="project" /> - <orderEntry type="library" name="Maven: junit-addons:junit-addons:1.4" level="project" /> - <orderEntry type="library" name="Maven: xerces:xmlParserAPIs:2.6.2" level="project" /> - <orderEntry type="library" name="Maven: org.mockito:mockito-all:1.9.5" level="project" /> - <orderEntry type="library" name="Maven: net.sourceforge.nekohtml:nekohtml:1.9.21" level="project" /> - <orderEntry type="library" name="Maven: io.netty:netty:3.5.7.Final" level="project" /> - <orderEntry type="library" name="Maven: com.opera:operadriver:1.5" level="project" /> - <orderEntry type="library" name="Maven: com.opera:operalaunchers:1.1" level="project" /> - <orderEntry type="library" name="Maven: com.google.guava:guava:14.0" level="project" /> - <orderEntry type="library" name="Maven: com.codeborne:phantomjsdriver:1.2.1" level="project" /> - <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-remote-driver:2.44.0" level="project" /> - <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:2.4.1" level="project" /> - <orderEntry type="library" name="Maven: milyn:sac:1.3" level="project" /> - <orderEntry type="library" name="Maven: org.eclipse.birt.runtime.3_7_1:org.apache.xml.serializer:2.7.1" level="project" /> - <orderEntry type="library" name="Maven: org.eclipse.birt.runtime.3_7_1:Tidy:1" level="project" /> - <orderEntry type="library" name="Maven: xalan:xalan:2.7.1" level="project" /> - <orderEntry type="library" name="Maven: xalan:serializer:2.7.1" level="project" /> - <orderEntry type="library" name="Maven: xerces:xercesImpl:2.11.0" level="project" /> - <orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" /> - <orderEntry type="library" name="Maven: xml-apis:xmlParserAPIs:2.0.2" level="project" /> - <orderEntry type="library" name="Maven: commons-validator:commons-validator:1.3.0" level="project" /> - <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.7.0" level="project" /> - <orderEntry type="library" name="Maven: commons-digester:commons-digester:1.6" level="project" /> - <orderEntry type="library" name="Maven: oro:oro:2.0.8" level="project" /> - <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" /> - <orderEntry type="library" name="Maven: org.jfree:jfreechart:1.0.19" level="project" /> - <orderEntry type="library" name="Maven: org.jfree:jcommon:1.0.23" level="project" /> - <orderEntry type="module-library"> - <library name="Maven: org.cewolf:cewolf:1.1"> - <CLASSES> - <root url="jar://$MODULE_DIR$/WebRoot/WEB-INF/lib/cewolf-1.1.jar!/" /> - </CLASSES> - <JAVADOC /> - <SOURCES /> - </library> - </orderEntry> - <orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:3.0.1" level="project" /> - <orderEntry type="library" name="Maven: net.jcip:jcip-annotations:1.0" level="project" /> - <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.1" level="project" /> - <orderEntry type="library" name="Maven: httpunit:httpunit:1.7" level="project" /> - <orderEntry type="library" name="Maven: javax.servlet:servlet-api:2.3" level="project" /> - <orderEntry type="library" name="Maven: jtidy:jtidy:4aug2000r7-dev" level="project" /> - <orderEntry type="library" name="Maven: org.easymock:easymock:2.5.2" level="project" /> - <orderEntry type="library" name="Maven: org.easymock:easymockclassextension:2.5.2" level="project" /> - <orderEntry type="library" name="Maven: org.objenesis:objenesis:1.2" level="project" /> - <orderEntry type="library" name="Maven: org.apache.tomcat:tomcat-util:8.0.28" level="project" /> - <orderEntry type="library" name="Maven: org.apache.tomcat:tomcat-juli:8.0.28" level="project" /> - <orderEntry type="library" name="Maven: tomcat:jasper-runtime:5.5.23" level="project" /> - <orderEntry type="library" name="Maven: commons-el:commons-el:1.0" level="project" /> - <orderEntry type="library" name="Maven: org.apache.tomcat:dbcp:6.0.44" level="project" /> - <orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.1.37" level="project" /> - <orderEntry type="library" name="Maven: junit:junit:4.12" level="project" /> - <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.3" level="project" /> - <orderEntry type="library" name="Maven: net.tanesha.recaptcha4j:recaptcha4j:0.0.7" level="project" /> - </component> -</module> \ No newline at end of file diff --git a/iTrust/src/edu/ncsu/csc/itrust/action/SendRemindersAction.java b/iTrust/src/edu/ncsu/csc/itrust/action/SendRemindersAction.java new file mode 100644 index 0000000000000000000000000000000000000000..ef8b0597ed3a9bfcdec4d7c3a3c92257ba418464 --- /dev/null +++ b/iTrust/src/edu/ncsu/csc/itrust/action/SendRemindersAction.java @@ -0,0 +1,67 @@ +package edu.ncsu.csc.itrust.action; + +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; + +import edu.ncsu.csc.itrust.beans.ApptBean; +import edu.ncsu.csc.itrust.beans.MessageBean; +import edu.ncsu.csc.itrust.beans.PersonnelBean; +import edu.ncsu.csc.itrust.dao.DAOFactory; +import edu.ncsu.csc.itrust.dao.mysql.ApptDAO; +import edu.ncsu.csc.itrust.dao.mysql.PersonnelDAO; +import edu.ncsu.csc.itrust.exception.DBException; +import edu.ncsu.csc.itrust.exception.FormValidationException; +import edu.ncsu.csc.itrust.exception.ITrustException; +import java.util.*; + +public class SendRemindersAction { + public final long systemReminderMID; + private long loggedInMID; + private ApptDAO apptDAO; + private SendMessageAction smAction; + + public SendRemindersAction(DAOFactory factory, long loggedInMID) throws DBException { + PersonnelDAO personnelDAO = factory.getPersonnelDAO(); + List<PersonnelBean> personnels = personnelDAO.searchForPersonnelWithName("System", "Reminder"); + this.systemReminderMID = personnels.get(0).getMID(); + this.loggedInMID = loggedInMID; + this.apptDAO = factory.getApptDAO(); + this.smAction = new SendMessageAction(factory, systemReminderMID); + } + + public void sendReminder(ApptBean aBean) throws ITrustException, SQLException, FormValidationException { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime date = aBean.getDate().toLocalDateTime(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm, MMM d"); + + MessageBean message = new MessageBean(); + message.setTo(aBean.getPatient()); + message.setFrom(systemReminderMID); + message.setSubject(String.format("Reminder: upcoming appointment in %d day(s)", now.truncatedTo(ChronoUnit.DAYS).until(date.truncatedTo(ChronoUnit.DAYS), ChronoUnit.DAYS))); + message.setBody(String.format("You have an appointment on %s with Dr. %s", date.format(formatter), smAction.getPersonnelName(aBean.getHcp()))); + message.setSentDate(Timestamp.valueOf(now)); + + smAction.sendMessage(message); + } + + public int sendReminderForAppointments(int numDays) throws ITrustException { + List<ApptBean> appointments = null; + try { + appointments = apptDAO.getUpcomingAppts(numDays); + for (ApptBean appt : appointments) { + sendReminder(appt); + } + return appointments.size(); + } catch (DBException e) { + throw new ITrustException("DB Error in sending reminders."); + } catch (SQLException e) { + throw new ITrustException("SQL Error in sending reminders."); + } catch (FormValidationException e) { + throw new ITrustException("Form Validation Error in sending reminders."); + } + + } +} \ No newline at end of file diff --git a/iTrust/src/edu/ncsu/csc/itrust/action/ViewDiagnosisStatisticsAction.java b/iTrust/src/edu/ncsu/csc/itrust/action/ViewDiagnosisStatisticsAction.java index a6f01b269e3e19cbf648a58e302193fedb13b238..8b04b6b50040678b230f8ab4480197ba9caac70f 100644 --- a/iTrust/src/edu/ncsu/csc/itrust/action/ViewDiagnosisStatisticsAction.java +++ b/iTrust/src/edu/ncsu/csc/itrust/action/ViewDiagnosisStatisticsAction.java @@ -182,36 +182,32 @@ public class ViewDiagnosisStatisticsAction { /** * Determines if an Influenza Epidemic is happening * - * @param curDateStr a date in the currently evaluated week + * @param weekDate a date in the currently evaluated week * @param zip the zip code to analyze * @return whether or not there is an epidemic * @throws ParseException * @throws DBException */ - public boolean isFluEpidemic(String curDateStr, String zip) throws ParseException, DBException { - new SimpleDateFormat("MM/dd/yyyy").parse("01/04/1998"); - Date curDate = new SimpleDateFormat("MM/dd/yyyy").parse(curDateStr); + public boolean isFluEpidemic(String weekDate, String zip) throws ParseException, DBException { + Date wkDate = new SimpleDateFormat("MM/dd/yyyy").parse(weekDate); Calendar cal = Calendar.getInstance(); - cal.setTime(curDate); + cal.setTime(wkDate); int weekOfYr = cal.get(Calendar.WEEK_OF_YEAR); - double threshold = calcThreshold(weekOfYr); - double thresholdL = calcThreshold(weekOfYr-1); - double thresholdN = calcThreshold(weekOfYr+1); - - DiagnosisStatisticsBean dbNow = diagnosesDAO.getCountForWeekOf(ICD_INFLUENZA, zip, cal.getTime()); - cal.add(Calendar.HOUR, -12*7); - DiagnosisStatisticsBean dbLast = diagnosesDAO.getCountForWeekOf(ICD_INFLUENZA, zip, cal.getTime()); - cal.add(Calendar.HOUR, 2*12*7); - DiagnosisStatisticsBean dbNext = diagnosesDAO.getCountForWeekOf(ICD_INFLUENZA, zip, cal.getTime()); - - double weekNow = (double) dbNow.getRegionStats(); - double weekL = (double) dbLast.getRegionStats(); - double weekN = (double) dbNext.getRegionStats(); - - return weekNow > threshold && (weekL > thresholdL || weekN > thresholdN); + double threshold = calcInfluenzaThreshold(weekOfYr); + + DiagnosisStatisticsBean prev1 = diagnosesDAO.getCountForWeekBefore(ICD_INFLUENZA, zip, cal.getTime()); + cal.add(Calendar.HOUR, -7*24); + DiagnosisStatisticsBean prev2 = diagnosesDAO.getCountForWeekBefore(ICD_INFLUENZA, zip, cal.getTime()); + + long weekL1 = prev1.getRegionStats(); + long weekL2 = prev2.getRegionStats(); + + boolean epidemicL1 = weekL1 > threshold; + boolean epidemicL2 = weekL2 > threshold; + return epidemicL1 && epidemicL2; } /** @@ -220,7 +216,7 @@ public class ViewDiagnosisStatisticsAction { * @param weekNumber the week of the year * @return the epidemic threshold for flu cases */ - private double calcThreshold(double weekNumber) { + private double calcInfluenzaThreshold(double weekNumber) { return 5.34 + 0.271 * weekNumber + 3.45 * Math.sin(2 * Math.PI * weekNumber / 52.0) + 8.41 * Math.cos(2 * Math.PI * weekNumber / 52.0); } diff --git a/iTrust/test/edu/ncsu/csc/itrust/selenium/SendRemindersTest.java b/iTrust/test/edu/ncsu/csc/itrust/selenium/SendRemindersTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6dfa3c967de80820686df6ee01c8aa548772a4af --- /dev/null +++ b/iTrust/test/edu/ncsu/csc/itrust/selenium/SendRemindersTest.java @@ -0,0 +1,97 @@ +package edu.ncsu.csc.itrust.selenium; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class SendRemindersTest extends iTrustSeleniumTest{ + + protected WebDriver driver; + + @Override + protected void setUp() throws Exception { + super.setUp(); + gen.clearAllTables(); + gen.standardData(); + } + + // Test sending reminders + public void testSendReminder() throws Exception { + // Login as admin + driver = login("9000000001", "pw"); + assertEquals("iTrust - Admin Home", driver.getTitle()); + driver.findElement(By.linkText("Send Appointment Reminders")).click(); + + // Send reminders + driver.findElement(By.name("withinDays")).sendKeys("10"); + driver.findElement(By.name("withinDays")).submit(); + assertEquals("Reminders were successfully sent", + driver.findElement(By.className("iTrustMessage")).getText()); + + // Create timestamp + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + Date date = new Date(); + String stamp = dateFormat.format(date); + + // Check admin reminders outbox + driver.findElement(By.linkText("Reminder Message Outbox")).click(); + assertNotNull(driver.findElement(By.className("fancyTable"))); + assertTrue(driver.getPageSource().contains(stamp)); + + // Check a reminder message + driver.findElement(By.linkText("Read")).click(); + assertTrue(driver.getPageSource().contains(stamp)); + + // Logout admin and login as patient + List<WebElement> links = driver.findElements(By.tagName("a")); + int count = 0; + for(int i = 0; i < links.size(); i++) { + if(links.get(i).getAttribute("href").contains("logout")) + { + count = i; + break; + } + } + links.get(count).click(); + driver = login("5", "pw"); + + // Check patient inbox + driver.findElement(By.linkText("Message Inbox")).click(); + int index = 1; + WebElement baseTable = driver.findElement(By.cssSelector(".display.fTable")); + List<WebElement> tableRows = baseTable.findElements(By.tagName("tr")); + assertTrue(tableRows.get(index).getText().contains("System Reminder")); + assertTrue(tableRows.get(index).getText().contains("Reminder: upcoming appointment")); + index++; + assertTrue(tableRows.get(index).getText().contains("Reminder: upcoming appointment")); + assertTrue(tableRows.get(index).getText().contains(stamp)); + } + + // Test invalid number of days input for sending reminders + public void testInvalidSendReminder() throws Exception { + + // Login as admin + driver = login("9000000001", "pw"); + assertEquals("iTrust - Admin Home", driver.getTitle()); + driver.findElement(By.linkText("Send Appointment Reminders")).click(); + + // Send reminder with negative days + driver.findElement(By.name("withinDays")).sendKeys("-4"); + driver.findElement(By.name("withinDays")).submit(); + assertEquals("Provide a positive number", + driver.findElement(By.className("iTrustError")).getText()); + + // Send reminder with non-numberic days + driver.findElement(By.name("withinDays")).sendKeys("Hello"); + driver.findElement(By.name("withinDays")).submit(); + assertEquals("Reminders failed to send. Please provide a positive number", + driver.findElement(By.className("iTrustError")).getText()); + } + + + + +} \ No newline at end of file diff --git a/iTrust/test/edu/ncsu/csc/itrust/selenium/ViewDiagnosisStatisticsTest.java b/iTrust/test/edu/ncsu/csc/itrust/selenium/ViewDiagnosisStatisticsTest.java index 1dd3d14fdb8b11d7a1b72b34a8811c95583e7094..cc69e4c816b71efecf16b19d590356007cc3ab12 100644 --- a/iTrust/test/edu/ncsu/csc/itrust/selenium/ViewDiagnosisStatisticsTest.java +++ b/iTrust/test/edu/ncsu/csc/itrust/selenium/ViewDiagnosisStatisticsTest.java @@ -559,50 +559,61 @@ public class ViewDiagnosisStatisticsTest extends iTrustSeleniumTest { assertLogged(TransactionType.DIAGNOSIS_EPIDEMICS_VIEW, 9000000007L, 0L, ""); assertTrue(driver.getPageSource().contains("There is no epidemic occurring in the region.")); } - - public void testViewDiagnosisEpidemics_ErrorFlows() throws Exception { - driver = (HtmlUnitDriver)login("9000000007", "pw"); + + private void setupErrorFlow(String icd, String zip, String date, String threshold) throws Exception { + driver = (HtmlUnitDriver)login("9000000007", "pw"); // Click Diagnosis Trends driver.findElement(By.cssSelector("h2.panel-title")).click(); driver.findElement(By.xpath("//div[@class='panel-body']/ul/li[11]")).click(); driver.findElement(By.linkText("Diagnosis Trends")).click(); - // Epidemics + // Go to epidemics assertTrue(driver.getCurrentUrl().equals(ADDRESS + "auth/hcp-pha/viewDiagnosisStatistics.jsp")); new Select(driver.findElement(By.name("viewSelect"))).selectByValue("epidemics"); driver.findElement(By.id("select_View")).click(); - - // No ICD code - driver.findElement(By.name("zipCode")).clear(); - driver.findElement(By.name("zipCode")).sendKeys("27607"); - driver.findElement(By.name("startDate")).clear(); - driver.findElement(By.name("startDate")).sendKeys("02/15/2010"); - driver.findElement(By.name("threshold")).sendKeys("110"); + + // Fill provided fields + if (icd != null) { + new Select(driver.findElement(By.name("icdCode"))).selectByVisibleText(icd); + } + + if (zip != null) { + driver.findElement(By.name("zipCode")).clear(); + driver.findElement(By.name("zipCode")).sendKeys(zip); + } + + if (date != null) { + driver.findElement(By.name("startDate")).clear(); + driver.findElement(By.name("startDate")).sendKeys(date); + } + + if (threshold != null) { + driver.findElement(By.name("threshold")).clear(); + driver.findElement(By.name("threshold")).sendKeys(threshold); + } + + // Submit driver.findElement(By.id("select_diagnosis")).click(); + } + + public void testViewDiagnosisEpidemicsNoICD() throws Exception { + setupErrorFlow(null, "27607", "02/15/2010", "110"); assertTrue(driver.getPageSource().contains("Invalid ICD code.")); - - // Invalid zip - new Select(driver.findElement(By.name("icdCode"))).selectByVisibleText("84.50 - Malaria"); - driver.findElement(By.name("zipCode")).clear(); - driver.findElement(By.name("zipCode")).sendKeys("asdf"); - driver.findElement(By.id("select_diagnosis")).click(); + } + + public void testViewDiagnosisEpidemicsBadZip() throws Exception { + setupErrorFlow("84.50 - Malaria", "asdf", "02/15/2010", "110"); assertTrue(driver.getPageSource().contains("Zip Code must be 5 digits!")); + } - // Invalid date - driver.findElement(By.name("startDate")).clear(); - driver.findElement(By.name("startDate")).sendKeys("asdf"); - driver.findElement(By.name("zipCode")).clear(); - driver.findElement(By.name("zipCode")).sendKeys("27607"); - driver.findElement(By.id("select_diagnosis")).click(); + public void testViewDiagnosisEpidemicsInvalidDate() throws Exception { + setupErrorFlow("84.50 - Malaria", "12345", "asdf", "110"); assertTrue(driver.getPageSource().contains("Enter dates in MM/dd/yyyy")); + } - // Invalid threshold - driver.findElement(By.name("threshold")).clear(); - driver.findElement(By.name("threshold")).sendKeys("asdf"); - driver.findElement(By.name("startDate")).clear(); - driver.findElement(By.name("startDate")).sendKeys("02/15/2010"); - driver.findElement(By.id("select_diagnosis")).click(); + public void testViewDiagnosisEpidemicsBadThreshold() throws Exception { + setupErrorFlow("84.50 - Malaria", "12345", "02/15/2010", "asdf"); assertTrue(driver.getPageSource().contains("Threshold must be an integer.")); } } \ No newline at end of file diff --git a/iTrust/test/edu/ncsu/csc/itrust/unit/action/SendRemindersActionTest.java b/iTrust/test/edu/ncsu/csc/itrust/unit/action/SendRemindersActionTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a91f84a430de111b88d1f79c3fb46a51fb3b509c --- /dev/null +++ b/iTrust/test/edu/ncsu/csc/itrust/unit/action/SendRemindersActionTest.java @@ -0,0 +1,68 @@ +package edu.ncsu.csc.itrust.unit.action; + +import edu.ncsu.csc.itrust.action.SendRemindersAction; +import edu.ncsu.csc.itrust.beans.ApptBean; +import edu.ncsu.csc.itrust.beans.MessageBean; +import edu.ncsu.csc.itrust.dao.DAOFactory; +import edu.ncsu.csc.itrust.dao.mysql.MessageDAO; +import edu.ncsu.csc.itrust.exception.FormValidationException; +import edu.ncsu.csc.itrust.exception.ITrustException; +import edu.ncsu.csc.itrust.unit.datagenerators.TestDataGenerator; +import edu.ncsu.csc.itrust.unit.testutils.TestDAOFactory; +import junit.framework.TestCase; + +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.List; + + +public class SendRemindersActionTest extends TestCase { + + private DAOFactory factory; + private MessageDAO messageDAO; + private SendRemindersAction srAction; + private TestDataGenerator gen; + private long patientId; + private long hcpId; + + @Override + protected void setUp() throws Exception { + super.setUp(); + gen = new TestDataGenerator(); + gen.clearAllTables(); + gen.standardData(); + + this.patientId = 2L; + this.hcpId = 9000000000L; + this.factory = TestDAOFactory.getTestInstance(); + this.messageDAO = new MessageDAO(this.factory); + this.srAction = new SendRemindersAction(this.factory, this.hcpId); + } + + public void testSendRemindersAction() throws ITrustException + { + int numberOfAppts = srAction.sendReminderForAppointments(10); + assertTrue(numberOfAppts >= 5); + } + + public void testSendReminders() throws ITrustException, SQLException, FormValidationException { + ApptBean aBean = new ApptBean(); + + aBean.setApptType("TEST"); + aBean.setPatient(patientId); + aBean.setHcp(hcpId); + aBean.setDate(Timestamp.valueOf(LocalDateTime.now().plusDays(4))); + + List<MessageBean> mbListBefore = messageDAO.getMessagesFor(patientId); + + srAction.sendReminder(aBean); + + List<MessageBean> mbList = messageDAO.getMessagesFor(patientId); + + assertEquals(mbList.size(), mbListBefore.size() + 1); + MessageBean mBeanDB = mbList.get(0); + assertEquals("Reminder: upcoming appointment in 4 day(s)", mBeanDB.getSubject()); + } + +} \ No newline at end of file diff --git a/iTrust/test/edu/ncsu/csc/itrust/unit/action/ViewDiagnosisStatisticsActionTest.java b/iTrust/test/edu/ncsu/csc/itrust/unit/action/ViewDiagnosisStatisticsActionTest.java index 30600b38c3d14103ef71830275c354c1cbb5f97c..a23d9f0d90422ced565e1f011d6a90e471b212a6 100644 --- a/iTrust/test/edu/ncsu/csc/itrust/unit/action/ViewDiagnosisStatisticsActionTest.java +++ b/iTrust/test/edu/ncsu/csc/itrust/unit/action/ViewDiagnosisStatisticsActionTest.java @@ -130,13 +130,22 @@ public class ViewDiagnosisStatisticsActionTest extends TestCase { } public void testIsMalariaEpidemicNone() throws Exception { + gen.malaria_epidemic1(); assertFalse(action.isMalariaEpidemic("06/02/2010", "38201", "110")); } public void testIsFluEpidemic() throws Exception { gen.influenza_epidemic(); - assertTrue(action.isFluEpidemic("11/02/" + thisYear, "27606")); - assertFalse(action.isFluEpidemic("11/16/" + thisYear, "27606")); + assertTrue(action.isFluEpidemic("11/16/" + thisYear, "27606")); + assertFalse(action.isFluEpidemic("11/09/" + thisYear, "27606")); + } + + public void testIsFluEpidemicEdge() throws Exception { + gen.influenza_epidemic(); + // Test should pass since previous 14 days will have enough cases for epidemic + assertTrue(action.isFluEpidemic("11/15/" + thisYear, "27606")); + // Test should fail since previous 14 days will not have enough cases for epidemic + assertFalse(action.isFluEpidemic("11/17/" + thisYear, "27606")); } public void testGetEpidemicStatisticsInvalidThreshold(){