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> obsRows = idMap.get(key); - if (obsRows == null) - obsRows = new ArrayList<>(); - - obsRows.add(rowMap); - idMap.put(key, obsRows); - } - }); - - List rows = new ArrayList<>(); - for (String key : idMap.keySet()) - { - List> toAdd = idMap.get(key); - - Date date = null; - String subjectId = null; - String categoryGroup = null; - String categoryColor = null; - String categoryText = null; - String performedBy = null; - String qcStateLabel = null; - Boolean publicData = null; - String taskId = null; - Integer taskRowId = null; - String formType = null; - String objectId = null; - StringBuilder html = new StringBuilder(); - - for (Map rowMap : toAdd) - { - date = (Date)rowMap.get("date"); - subjectId = (String)rowMap.get("subjectId"); - performedBy = (String)rowMap.get("performedBy"); - categoryText = (String)rowMap.get("categoryText"); - categoryGroup = (String)rowMap.get("categoryGroup"); - categoryColor = (String)rowMap.get("categoryColor"); - qcStateLabel = (String)rowMap.get("qcStateLabel"); - publicData = (Boolean)rowMap.get("publicData"); - taskId = (String)rowMap.get("taskId"); - taskRowId = (Integer)rowMap.get("taskRowId"); - formType = (String)rowMap.get("formType"); - objectId = (String)rowMap.get("objectId"); - - html.append(rowMap.get("html")); - } - - if (performedBy != null && !redacted) - { - html.append("Performed By: ").append(PageFlowUtil.filter(performedBy)).append("\n"); - } - - HistoryRow row = new HistoryRowImpl(this, categoryText, categoryGroup, categoryColor, subjectId, date, html.toString(), qcStateLabel, publicData, taskId, taskRowId, formType, objectId); - row.setShowTime(false); - rows.add(row); - } - - return rows; - } - - private String getObservationLine(Results rs, boolean redacted) throws SQLException - { - StringBuilder sb = new StringBuilder(); - - String category = rs.getString(FieldKey.fromString("category")); - if (category == null) - { - return null; - } - - sb.append(PageFlowUtil.filter(category)); - - //note: the following is added as 1 line - String area = rs.getString(FieldKey.fromString("area")); - if (area != null && !"N/A".equalsIgnoreCase(area)) - { - sb.append(" (").append(PageFlowUtil.filter(area)).append(")"); - } - - sb.append(": "); - - if (rs.getString(FieldKey.fromString("observation")) != null) - { - // check if observation is hydration includes string >10% - if (rs.getString(FieldKey.fromString("observation")).contains(">10%")) - { - sb.append("Hydration: >10%"); - } - else - { - sb.append(PageFlowUtil.filter(rs.getString(FieldKey.fromString("observation")))); - } - } - - if (rs.getString(FieldKey.fromString("remark")) != null) - { - if (!sb.isEmpty()) - sb.append(". "); - sb.append(PageFlowUtil.filter(rs.getString(FieldKey.fromString("remark")))); - } - - if (!sb.isEmpty()) - sb.append("\n"); - - return sb.toString(); - } - - @Override - protected String getHtml(Container c, Results rs, boolean redacted) - { - throw new UnsupportedOperationException("This should not be called"); - } - - @Override - protected Set getColumnNames() - { - return PageFlowUtil.set("Id", "date", "category", "area", "observation", "remark", "performedby/displayName", "objectid"); + super("study", "clinicalObservations", "Clinical Observations", "Clinical Observations", module); } } diff --git a/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCObservationOrdersDataSource.java b/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCObservationOrdersDataSource.java index c177824f..a44637cb 100644 --- a/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCObservationOrdersDataSource.java +++ b/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCObservationOrdersDataSource.java @@ -29,7 +29,7 @@ public class NIRCObservationOrdersDataSource extends AbstractDataSource { public NIRCObservationOrdersDataSource(Module module) { - super("study", "observation_order", "Observations", "Clinical", module); + super("study", "observation_order", "Observation Orders", "Clinical", module); } @Override @@ -108,7 +108,7 @@ protected List processRows(Container c, TableSelector ts, final bool if (performedBy != null && !redacted) { - html.append("Performed By: ").append(PageFlowUtil.filter(performedBy)).append("\n"); + html.append("Ordered By: ").append(PageFlowUtil.filter(performedBy)).append("\n"); } HistoryRow row = new HistoryRowImpl(this, categoryText, categoryGroup, categoryColor, subjectId, date, html.toString(), qcStateLabel, publicData, taskId, taskRowId, formType, objectId); diff --git a/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCObservationsDataSource.java b/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCObservationsDataSource.java new file mode 100644 index 00000000..2448c0d8 --- /dev/null +++ b/nirc_ehr/src/org/labkey/nirc_ehr/history/NIRCObservationsDataSource.java @@ -0,0 +1,180 @@ +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 NIRCObservationsDataSource extends AbstractDataSource +{ + public NIRCObservationsDataSource(String schema, String query, String categoryText, String primaryGroup, Module module) + { + super(schema, query, categoryText, primaryGroup, 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> obsRows = idMap.get(key); + if (obsRows == null) + obsRows = new ArrayList<>(); + + obsRows.add(rowMap); + idMap.put(key, obsRows); + } + }); + + List rows = new ArrayList<>(); + for (String key : idMap.keySet()) + { + List> toAdd = idMap.get(key); + + Date date = null; + String subjectId = null; + String categoryGroup = null; + String categoryColor = null; + String categoryText = null; + String performedBy = null; + String qcStateLabel = null; + Boolean publicData = null; + String taskId = null; + Integer taskRowId = null; + String formType = null; + String objectId = null; + StringBuilder html = new StringBuilder(); + + for (Map rowMap : toAdd) + { + date = (Date)rowMap.get("date"); + subjectId = (String)rowMap.get("subjectId"); + performedBy = (String)rowMap.get("performedBy"); + categoryText = (String)rowMap.get("categoryText"); + categoryGroup = (String)rowMap.get("categoryGroup"); + categoryColor = (String)rowMap.get("categoryColor"); + qcStateLabel = (String)rowMap.get("qcStateLabel"); + publicData = (Boolean)rowMap.get("publicData"); + taskId = (String)rowMap.get("taskId"); + taskRowId = (Integer)rowMap.get("taskRowId"); + formType = (String)rowMap.get("formType"); + objectId = (String)rowMap.get("objectId"); + + html.append(rowMap.get("html")); + } + + if (performedBy != null && !redacted) + { + html.append("Performed By: ").append(PageFlowUtil.filter(performedBy)).append("\n"); + } + + HistoryRow row = new HistoryRowImpl(this, categoryText, categoryGroup, categoryColor, subjectId, date, html.toString(), qcStateLabel, publicData, taskId, taskRowId, formType, objectId); + row.setShowTime(false); + rows.add(row); + } + + return rows; + } + + private String getObservationLine(Results rs, boolean redacted) throws SQLException + { + StringBuilder sb = new StringBuilder(); + + String category = rs.getString(FieldKey.fromString("category")); + if (category == null) + { + return null; + } + + sb.append(PageFlowUtil.filter(category)); + + //note: the following is added as 1 line + String area = rs.getString(FieldKey.fromString("area")); + if (area != null && !"N/A".equalsIgnoreCase(area)) + { + sb.append(" (").append(PageFlowUtil.filter(area)).append(")"); + } + + sb.append(": "); + + if (rs.getString(FieldKey.fromString("observation")) != null) + { + // check if observation is hydration includes string >10% + if (rs.getString(FieldKey.fromString("observation")).contains(">10%")) + { + sb.append("Hydration: >10%"); + } + else + { + sb.append(PageFlowUtil.filter(rs.getString(FieldKey.fromString("observation")))); + } + } + + if (rs.getString(FieldKey.fromString("remark")) != null) + { + if (!sb.isEmpty()) + sb.append(". "); + sb.append(PageFlowUtil.filter(rs.getString(FieldKey.fromString("remark")))); + } + + if (!sb.isEmpty()) + sb.append("\n"); + + return sb.toString(); + } + + @Override + protected String getHtml(Container c, Results rs, boolean redacted) + { + throw new UnsupportedOperationException("This should not be called"); + } + + @Override + protected Set getColumnNames() + { + return PageFlowUtil.set("Id", "date", "category", "area", "observation", "remark", "performedby/displayName", "objectid"); + } +} diff --git a/nirc_ehr/src/org/labkey/nirc_ehr/history/ObservationsDataSource.java b/nirc_ehr/src/org/labkey/nirc_ehr/history/ObservationsDataSource.java deleted file mode 100644 index 76ed8efe..00000000 --- a/nirc_ehr/src/org/labkey/nirc_ehr/history/ObservationsDataSource.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.labkey.nirc_ehr.history; - -import org.labkey.api.data.Container; -import org.labkey.api.data.Results; -import org.labkey.api.ehr.history.AbstractDataSource; -import org.labkey.api.module.Module; -import org.labkey.api.query.FieldKey; -import org.labkey.api.util.PageFlowUtil; - -import java.sql.SQLException; - -public class ObservationsDataSource extends AbstractDataSource -{ - - public ObservationsDataSource(Module module) - { - super("study", "obs", "Observations", "Observations", module); - } - - @Override - protected String getHtml(Container c, Results rs, boolean redacted) throws SQLException - { - StringBuilder sb = new StringBuilder(); - - if (rs.hasColumn(FieldKey.fromString("category")) && rs.getObject("category") != null) - { - addRow(sb, "Category", rs.getString("category")); - } - - if (rs.hasColumn(FieldKey.fromString("diagnosis")) && rs.getObject("diagnosis") != null) - { - addRow(sb, "Diagnosis", rs.getString("diagnosis")); - } - - if (rs.hasColumn(FieldKey.fromString("remark")) && rs.getObject("remark") != null) - { - addRow(sb, "Remark", rs.getString("remark")); - } - - return sb.toString(); - } - - private void addRow(StringBuilder sb, String displayLabel, String value) - { - sb.append(displayLabel); - sb.append(": "); - sb.append(PageFlowUtil.filter(value)); - sb.append("\n"); - } -} diff --git a/nirc_ehr/src/org/labkey/nirc_ehr/query/NIRC_EHRTriggerHelper.java b/nirc_ehr/src/org/labkey/nirc_ehr/query/NIRC_EHRTriggerHelper.java index 60fa7227..c423298f 100644 --- a/nirc_ehr/src/org/labkey/nirc_ehr/query/NIRC_EHRTriggerHelper.java +++ b/nirc_ehr/src/org/labkey/nirc_ehr/query/NIRC_EHRTriggerHelper.java @@ -760,55 +760,56 @@ public Map handleScheduledObservations(Map row, String taskid = ConvertHelper.convert(row.get("taskid"), String.class); // Get observation orders for these tasks - TableInfo ti = getTableInfo("study", "observation_order"); + TableInfo ti = getTableInfo("study", "observationOrdersByDate"); SimpleFilter filter = new SimpleFilter(FieldKey.fromString("taskid"), orderTasks, CompareType.IN); filter.addCondition(FieldKey.fromString("category"), category); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("category,caseid,Id,area,objectid"), filter, null); + filter.addCondition(FieldKey.fromString("date"), scheduledDate); + TableSelector ts = new TableSelector(ti, PageFlowUtil.set("category","caseId","animalId","area","objectid","type","taskid"), filter, null); + ts.setNamedParameters(Map.of("StartDate", scheduledDate, "NumDays", "1")); Map[] orders = ts.getMapArray(); Map triggerOrder = null; - if (orders.length > 0) + for (int i = 0; i < orders.length; i++) { - for (int i = 0; i < orders.length; i++) - { - Map order = orders[i]; + Map order = orders[i]; - // First order we find will fill out the information in the row passing through the trigger - if (i == 0) - { - triggerOrder = new HashMap<>(); - triggerOrder.put("caseid", order.get("caseid")); - triggerOrder.put("area", order.get("area")); - triggerOrder.put("orderId", order.get("objectid")); - continue; - } - - // If there are multiple treatment orders that match insert the others here - Map obsRow = new CaseInsensitiveHashMap<>(); - obsRow.put("caseid", order.get("caseid")); - obsRow.put("category", order.get("category")); - obsRow.put("date", date); - obsRow.put("qcstate", qcstate); - obsRow.put("Id", order.get("Id")); - obsRow.put("scheduledDate", scheduledDate); - obsRow.put("area", order.get("area")); - obsRow.put("observation", observation); - obsRow.put("performedBy", performedBy); - obsRow.put("orderId", order.get("objectid")); - obsRow.put("taskid", order.get("taskid")); - - List> rows = new ArrayList<>(); - rows.add(obsRow); - - BatchValidationException errors = new BatchValidationException(); - TableInfo obsTi = getTableInfo("study", "clinical_observations"); - obsTi.getUpdateService().insertRows(_user, _container, rows, errors, null, getExtraContext()); - if (errors.hasErrors()) - throw errors; + // First order we find will fill out the information in the row passing through the trigger + if (i == 0) + { + triggerOrder = new HashMap<>(); + triggerOrder.put("caseId", order.get("caseId")); + triggerOrder.put("area", order.get("area")); + triggerOrder.put("orderId", order.get("objectid")); + triggerOrder.put("type", order.get("type")); + continue; } + // If there are multiple treatment orders that match insert the others here + Map obsRow = new CaseInsensitiveHashMap<>(); + obsRow.put("caseId", order.get("caseId")); + obsRow.put("category", order.get("category")); + obsRow.put("date", date); + obsRow.put("qcstate", qcstate); + obsRow.put("Id", order.get("animalId")); + obsRow.put("scheduledDate", scheduledDate); + obsRow.put("area", order.get("area")); + obsRow.put("observation", observation); + obsRow.put("performedBy", performedBy); + obsRow.put("orderId", order.get("objectid")); + obsRow.put("type", order.get("type")); + obsRow.put("taskid", order.get("taskid")); + + List> rows = new ArrayList<>(); + rows.add(obsRow); + + BatchValidationException errors = new BatchValidationException(); + TableInfo obsTi = getTableInfo("study", "clinical_observations"); + obsTi.getUpdateService().insertRows(_user, _container, rows, errors, null, getExtraContext()); + if (errors.hasErrors()) + throw errors; } + return triggerOrder; }