diff --git a/nirc_ehr/resources/queries/study/clinical_observations.js b/nirc_ehr/resources/queries/study/clinical_observations.js
index 45b57ddb..38f07036 100644
--- a/nirc_ehr/resources/queries/study/clinical_observations.js
+++ b/nirc_ehr/resources/queries/study/clinical_observations.js
@@ -31,6 +31,14 @@ function onUpsert(helper, scriptErrors, row, oldRow) {
EHR.Server.Utils.addError(scriptErrors, 'remark', "You selected 'Other' for 'Daily Enrichment', please enter Remark", "WARN");
}
+ if (row.category === "Alopecia Score" && !row.observation) {
+ EHR.Server.Utils.addError(scriptErrors, 'observation', "Score required for 'Alopecia Score'.", "WARN");
+ }
+
+ if (row.category === "Alopecia Score" && !row.remark) {
+ EHR.Server.Utils.addError(scriptErrors, 'remark', "Remark required for 'Alopecia Score'.", "WARN");
+ }
+
var yesRemarkRequired = (row.category === "Self Biting Observed" || row.category === "New Injury Observed" || row.category === "Other Stereotopy" || row.category === "Environmental Change" || row.category === "Special Enrichment");
if (yesRemarkRequired && row.observation === "Yes" && !row.remark) {
EHR.Server.Utils.addError(scriptErrors, 'remark', "You selected 'Yes' for " + row.category + ", please explain in the Remark", "WARN");
@@ -55,9 +63,10 @@ function onUpsert(helper, scriptErrors, row, oldRow) {
var orderData = triggerHelper.handleScheduledObservations(row, qc.RowId, orderTasks[0]);
if (orderData) {
- row.caseid = orderData.caseId;
+ row.caseId = orderData.caseId;
row.orderid = orderData.orderId;
row.area = orderData.area;
+ row.type = orderData.type;
}
}
}
diff --git a/nirc_ehr/resources/queries/study/observationOrdersByDate.sql b/nirc_ehr/resources/queries/study/observationOrdersByDate.sql
new file mode 100644
index 00000000..4e4dcc5f
--- /dev/null
+++ b/nirc_ehr/resources/queries/study/observationOrdersByDate.sql
@@ -0,0 +1,52 @@
+SELECT
+s.*,
+co.qcstate.label AS obsStatus
+FROM
+ (SELECT
+ s1.*,
+ timestampadd('SQL_TSI_MINUTE', ((s1.hours * 60) + s1.minutes), s1.origDate) AS date,
+ ((s1.hours * 60) + s1.minutes) AS timeOffset
+
+ FROM (
+ SELECT
+ t1.lsid,
+ t1.dataset,
+ t1.id AS animalid,
+ coalesce(ft.hourofday, ((hour(t1.date) * 100) + minute(t1.date))) AS time,
+ (coalesce(ft.hourofday, (hour(t1.date) * 100)) / 100) AS hours,
+
+ CASE WHEN ft.hourofday IS NOT NULL
+ THEN (((ft.hourofday / 100.0) - floor(ft.hourofday / 100)) * 100)
+ ELSE minute(t1.date)
+ END AS minutes,
+
+ dr.date AS origDate,
+
+ t1.frequency.meaning AS frequency,
+ t1.date AS startDate,
+ timestampdiff('SQL_TSI_DAY', cast(t1.dateOnly AS timestamp), dr.dateOnly) + 1 AS daysElapsed,
+ t1.enddate,
+ t1.category,
+ t1.area,
+ t1.performedby,
+ t1.remark,
+ t1.caseid.objectid AS caseid,
+ t1.taskid,
+ t1.type,
+ t1.objectid,
+
+ t1.qcstate
+ FROM nirc_ehr.dateRange dr
+ JOIN
+
+ -- order by category to replace string with Daily Obs
+ (SELECT * FROM study.observation_order ORDER BY category) t1
+ ON (dr.dateOnly >= t1.dateOnly AND (dr.dateOnly <= t1.enddate OR t1.enddate IS NULL) AND
+ --technically the first day of the treatment is day 1, not day 0
+ ((mod(CAST(timestampdiff('SQL_TSI_DAY', CAST(t1.dateOnly AS timestamp), dr.dateOnly) AS integer), t1.frequency.intervalindays) = 0 AND t1.frequency.intervalindays IS NOT NULL AND t1.frequency.dayofweek IS NULL)))
+ LEFT JOIN ehr_lookups.treatment_frequency_times ft ON ft.frequency = t1.frequency.meaning
+ WHERE t1.date IS NOT NULL
+
+ ) s1
+) s
+LEFT JOIN study.clinical_observations co ON co.scheduledDate IS NOT NULL AND s.date = co.scheduledDate AND co.orderId = s.objectid
\ No newline at end of file
diff --git a/nirc_ehr/resources/queries/study/observationSchedule.sql b/nirc_ehr/resources/queries/study/observationSchedule.sql
index ccab01b9..296d2385 100644
--- a/nirc_ehr/resources/queries/study/observationSchedule.sql
+++ b/nirc_ehr/resources/queries/study/observationSchedule.sql
@@ -2,93 +2,31 @@ SELECT
g.id,
g.scheduledDate,
COUNT(g.caseid) cases,
- GROUP_CONCAT(g.observations, ';') as observations,
- SUM(obsCount) as obsCount,
- GROUP_CONCAT(g.obsOrderIds, ';') as orderIds,
- GROUP_CONCAT(g.status, ';') as status,
- GROUP_CONCAT(g.taskids, ';') as taskids,
- MAX(g.type) as type,
- MAX(g.caseid) as caseid
+ GROUP_CONCAT(g.observations, ';') AS observations,
+ SUM(obsCount) AS obsCount,
+ GROUP_CONCAT(g.obsOrderIds, ';') AS orderIds,
+ GROUP_CONCAT(g.status, ';') AS status,
+ GROUP_CONCAT(g.taskids, ';') AS taskids,
+ MAX(g.type) AS type,
+ MAX(g.caseid) AS caseid
FROM
(
SELECT
- sch.id,
- sch.date as scheduledDate,
+ sch.animalId as id,
+ sch.date AS scheduledDate,
sch.caseid,
sch.type,
- GROUP_CONCAT(sch.objectid, ';') as obsOrderIds,
- GROUP_CONCAT(sch.category, ';') as observations,
- GROUP_CONCAT(obsStatus, ';') as status,
- GROUP_CONCAT(DISTINCT(sch.taskid), ';') as taskids,
- COUNT(sch.category) as obsCount,
- COUNT(sch.obsStatus) as statusCount
- FROM
- (
- SELECT
- d.id,
- s.*,
- co.qcstate.label as obsStatus
- FROM study.demographics d JOIN
- (SELECT
- s1.*,
- timestampadd('SQL_TSI_MINUTE', ((s1.hours * 60) + s1.minutes), s1.origDate) as date,
- ((s1.hours * 60) + s1.minutes) as timeOffset
-
- FROM (
-
- SELECT
- t1.lsid,
- t1.dataset,
- t1.id as animalid,
-
- coalesce(ft.hourofday, ((hour(t1.date) * 100) + minute(t1.date))) as time,
- (coalesce(ft.hourofday, (hour(t1.date) * 100)) / 100) as hours,
-
- CASE WHEN ft.hourofday IS NOT NULL
- THEN (((ft.hourofday / 100.0) - floor(ft.hourofday / 100)) * 100)
- ELSE minute(t1.date)
- END as minutes,
-
- dr.date as origDate,
-
- t1.frequency.meaning as frequency,
- t1.date as startDate,
- timestampdiff('SQL_TSI_DAY', cast(t1.dateOnly as timestamp), dr.dateOnly) + 1 as daysElapsed,
- t1.enddate,
- t1.category,
- t1.area,
- t1.performedby,
- t1.remark,
- t1.caseid,
- t1.taskid,
- t1.type,
- t1.objectid,
-
- t1.qcstate
-
- FROM nirc_ehr.dateRange dr
-
- JOIN
-
- -- order by category to replace string with Daily Obs
- (SELECT * FROM
- study.observation_order
- ORDER BY category) t1
- ON (dr.dateOnly >= t1.dateOnly and dr.dateOnly <= t1.enddateCoalesced AND
- --technically the first day of the treatment is day 1, not day 0
- ((mod(CAST(timestampdiff('SQL_TSI_DAY', CAST(t1.dateOnly as timestamp), dr.dateOnly) as integer), t1.frequency.intervalindays) = 0 And t1.frequency.intervalindays is not null And t1.frequency.dayofweek is null)))
-
- LEFT JOIN ehr_lookups.treatment_frequency_times ft ON ft.frequency = t1.frequency.meaning
-
- WHERE t1.date is not null
-
- ) s1
-
- ) s ON (s.animalid = d.id)
- LEFT JOIN study.clinical_observations co ON co.scheduledDate IS NOT NULL AND s.date = co.scheduledDate AND co.orderId = s.objectid
+ GROUP_CONCAT(sch.objectid, ';') AS obsOrderIds,
+ GROUP_CONCAT(sch.category, ';') AS observations,
+ GROUP_CONCAT(obsStatus, ';') AS status,
+ GROUP_CONCAT(DISTINCT(sch.taskid), ';') AS taskids,
+ COUNT(sch.category) AS obsCount,
+ COUNT(sch.obsStatus) AS statusCount
+ FROM (
+ SELECT * FROM observationOrdersByDate
) sch
GROUP BY
- sch.id,
+ sch.animalId,
sch.date,
sch.caseid,
sch.type
diff --git a/nirc_ehr/resources/referenceStudy/study/datasets/datasets_manifest.xml b/nirc_ehr/resources/referenceStudy/study/datasets/datasets_manifest.xml
index 113f54ea..1d03f01c 100644
--- a/nirc_ehr/resources/referenceStudy/study/datasets/datasets_manifest.xml
+++ b/nirc_ehr/resources/referenceStudy/study/datasets/datasets_manifest.xml
@@ -24,7 +24,6 @@
-
diff --git a/nirc_ehr/resources/referenceStudy/study/datasets/datasets_metadata.xml b/nirc_ehr/resources/referenceStudy/study/datasets/datasets_metadata.xml
index 277987f0..91ac8907 100644
--- a/nirc_ehr/resources/referenceStudy/study/datasets/datasets_metadata.xml
+++ b/nirc_ehr/resources/referenceStudy/study/datasets/datasets_metadata.xml
@@ -291,7 +291,7 @@
- Clinical Observations
+ Clinical/Behavior Observations
varchar
@@ -678,29 +678,6 @@
Inbreeding Coefficients
-
- Observations
-
-
- varchar
- http://cpas.labkey.com/Study#ParticipantId
-
- ptid
-
-
-
- timestamp
- http://cpas.labkey.com/Study#VisitDate
- http://cpas.labkey.com/Study#VisitDate
-
-
- varchar
-
-
- varchar
-
-
-
Necropsy
diff --git a/nirc_ehr/src/org/labkey/nirc_ehr/NIRC_EHRModule.java b/nirc_ehr/src/org/labkey/nirc_ehr/NIRC_EHRModule.java
index f34bf769..e80bd590 100644
--- a/nirc_ehr/src/org/labkey/nirc_ehr/NIRC_EHRModule.java
+++ b/nirc_ehr/src/org/labkey/nirc_ehr/NIRC_EHRModule.java
@@ -152,12 +152,12 @@ protected void doStartupAfterSpringConfig(ModuleContext moduleContext)
EHRService.get().registerHistoryDataSource(new NIRCCaseCloseDataSource(this));
EHRService.get().registerHistoryDataSource(new NIRCCaseOpenDataSource(this));
EHRService.get().registerHistoryDataSource(new NIRCClinicalObservationsDataSource(this));
+ EHRService.get().registerHistoryDataSource(new NIRCBehaviorObservationsDataSource(this));
EHRService.get().registerHistoryDataSource(new NIRCClinicalRemarksDataSource(this));
EHRService.get().registerHistoryDataSource(new NIRCEndTreatmentOrderDataSource(this));
EHRService.get().registerHistoryDataSource(new NIRCHousingDataSource(this));
EHRService.get().registerHistoryDataSource(new NIRCObservationOrdersDataSource(this));
EHRService.get().registerHistoryDataSource(new NIRCVitalsDataSource(this));
- EHRService.get().registerHistoryDataSource(new ObservationsDataSource(this));
EHRService.get().registerHistoryDataSource(new PairingsDataSource(this));
EHRService.get().registerHistoryDataSource(new PhysicalExamDataSource(this));
EHRService.get().registerHistoryDataSource(new PregnancyDataSource(this));
diff --git a/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCBehaviorObservationsDataSource.java b/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCBehaviorObservationsDataSource.java
new file mode 100644
index 00000000..f7d6ac65
--- /dev/null
+++ b/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCBehaviorObservationsDataSource.java
@@ -0,0 +1,12 @@
+package org.labkey.nirc_ehr.history;
+
+import org.labkey.api.module.Module;
+
+public class NIRCBehaviorObservationsDataSource extends NIRCObservationsDataSource
+{
+ public NIRCBehaviorObservationsDataSource(Module module)
+ {
+ super("study", "behaviorObservations", "Behavior Observations", "Behavior Observations", module);
+ }
+}
+
diff --git a/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCClinicalObservationsDataSource.java b/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCClinicalObservationsDataSource.java
index ca5eaa5a..93f41a08 100644
--- a/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCClinicalObservationsDataSource.java
+++ b/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCClinicalObservationsDataSource.java
@@ -1,180 +1,11 @@
package org.labkey.nirc_ehr.history;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.time.DateUtils;
-import org.labkey.api.collections.CaseInsensitiveHashMap;
-import org.labkey.api.data.ColumnInfo;
-import org.labkey.api.data.Container;
-import org.labkey.api.data.Results;
-import org.labkey.api.data.ResultsImpl;
-import org.labkey.api.data.TableSelector;
-import org.labkey.api.ehr.history.AbstractDataSource;
-import org.labkey.api.ehr.history.HistoryRow;
-import org.labkey.api.ehr.history.HistoryRowImpl;
import org.labkey.api.module.Module;
-import org.labkey.api.query.FieldKey;
-import org.labkey.api.util.PageFlowUtil;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class NIRCClinicalObservationsDataSource extends AbstractDataSource
+public class NIRCClinicalObservationsDataSource extends NIRCObservationsDataSource
{
public NIRCClinicalObservationsDataSource(Module module)
{
- super("study", "clinical_observations", "Clinical Observations", "Clinical", module);
- }
-
- @Override
- protected List processRows(Container c, TableSelector ts, final boolean redacted, final Collection cols)
- {
- final Map>> idMap = new HashMap<>();
- ts.forEach(rs -> {
- Results results = new ResultsImpl(rs, cols);
-
- String html = getObservationLine(results, redacted);
- if (!StringUtils.isEmpty(html))
- {
- Map rowMap = new CaseInsensitiveHashMap<>();
-
- rowMap.put("date", results.getTimestamp(getDateField()));
- rowMap.put("categoryText", getCategoryText(results));
- rowMap.put("categoryGroup", getPrimaryGroup(results));
- rowMap.put("categoryColor", getCategoryColor(results));
- rowMap.put("performedBy", results.getString(FieldKey.fromString("performedby/displayName")));
- rowMap.put("qcStateLabel", results.getString(FieldKey.fromString("qcState/Label")));
- rowMap.put("publicData", results.getBoolean(FieldKey.fromString("qcState/PublicData")));
- rowMap.put("subjectId", results.getString(FieldKey.fromString(_subjectIdField)));
- rowMap.put("taskId", results.getString(FieldKey.fromString("taskId")));
- rowMap.put("taskRowId", results.getInt(FieldKey.fromString("taskId/rowid")));
- rowMap.put("formType", results.getString(FieldKey.fromString("taskId/formtype")));
- rowMap.put("objectId", results.getString(FieldKey.fromString("objectId")));
- rowMap.put("html", html);
-
- Date roundedDate = DateUtils.truncate((Date)rowMap.get("date"), Calendar.MINUTE);
- String key = results.getString(FieldKey.fromString("taskid")) + "||" + rowMap.get("Id") + "||" + rowMap.get("categoryText") + "||" + rowMap.get("categoryGroup") + "||" + roundedDate;
- List