From fb3615bab349b6b58bd5f04ae780ceacb6501e96 Mon Sep 17 00:00:00 2001 From: Chad Sebranek Date: Wed, 4 Dec 2024 16:02:18 -0600 Subject: [PATCH] Updates to current blood draw queries and adding visual plot (#703) * Add blood graph along with queries to support it, as well as new column for blood avail including thirty days in the future * exclude today for next 30 days calculation of blood, fix blood summary calc, adjust labels * use next 30 days since it does not include today * use ehr version * remove wnprc blood graph to use ehr instead * Consolidate blood draw reports into currentBloodDraws.sql, adjust references * ignore project type * group up the blood draws if they are done at the same time * Revert back to original AvailBlood calculation, add new calc for future draws in the new current blood report, fix ehr blood store so all records in transaction are used * update notification to revert to old blood avail name, use species as lookups for blood queries * restore demographicsBloodSummary query file * update test comments * restore old blood draw query --------- Co-authored-by: Marty Pradere --- .../resources/queries/study/Current Blood.sql | 113 ------------- .../queries/study/Current Blood/.qview.xml | 42 ----- .../queries/study/bloodDrawChanges.sql | 71 ++++++++ .../queries/study/bloodSummary.query.xml | 72 ++++----- .../resources/queries/study/bloodSummary.sql | 149 ++++++++--------- ....query.xml => currentBloodDraws.query.xml} | 153 ++++++++++-------- .../queries/study/currentBloodDraws.sql | 104 ++++++++++++ .../study/currentBloodDraws/.qview.xml | 43 +++++ .../demographics/Blood Draw Info.qview.xml | 2 +- .../study/demographicsBloodSummary.query.xml | 115 ++++++------- .../study/demographicsBloodSummary.sql | 146 +++++++---------- WNPRC_EHR/resources/web/ehr/ext3/ehrStore.js | 2 +- .../resources/web/wnprc_ehr/wnprcReports.js | 47 ++++++ 13 files changed, 567 insertions(+), 492 deletions(-) delete mode 100644 WNPRC_EHR/resources/queries/study/Current Blood.sql delete mode 100644 WNPRC_EHR/resources/queries/study/Current Blood/.qview.xml create mode 100644 WNPRC_EHR/resources/queries/study/bloodDrawChanges.sql rename WNPRC_EHR/resources/queries/study/{Current Blood.query.xml => currentBloodDraws.query.xml} (53%) create mode 100644 WNPRC_EHR/resources/queries/study/currentBloodDraws.sql create mode 100644 WNPRC_EHR/resources/queries/study/currentBloodDraws/.qview.xml diff --git a/WNPRC_EHR/resources/queries/study/Current Blood.sql b/WNPRC_EHR/resources/queries/study/Current Blood.sql deleted file mode 100644 index 6187c80ed..000000000 --- a/WNPRC_EHR/resources/queries/study/Current Blood.sql +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2010-2013 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -SELECT - bq.*, - cast(CASE - WHEN bq.species = 'Marmoset' - THEN round(bq.weight*0.15*60, 1) - ELSE - round(bq.weight*0.2*60, 1) - END as numeric) AS MaxBlood, - cast(CASE - WHEN bq.species = 'Marmoset' - THEN round((bq.weight*0.15*60) - bq.BloodLast30, 1) - ELSE - round((bq.weight*0.2*60) - bq.BloodLast30, 1) - END AS numeric) AS AvailBlood -FROM -( - SELECT - b.*, - (select species from study.demographics d where d.id = b.id) as species, - ( - CONVERT ( - (SELECT AVG(w.weight) AS _expr - FROM study.weight w - WHERE w.id=b.id AND w.date=b.lastWeighDate - AND w.qcstate.publicdata = true - ), double ) - ) AS weight - FROM - ( - SELECT bi.* - ,timestampadd('SQL_TSI_DAY', -29, bi.date) as minDate - ,timestampadd('SQL_TSI_DAY', 29, bi.date) as maxDate - ,( CONVERT( - (SELECT MAX(w.date) as _expr - FROM study.weight w - WHERE w.id = bi.id - --AND w.date <= bi.date - AND CAST(CAST(w.date AS DATE) AS TIMESTAMP) <= bi.date - AND w.qcstate.publicdata = true - ), timestamp ) - ) AS lastWeighDate - , ( COALESCE ( - (SELECT SUM(coalesce(draws.quantity, 0)) AS _expr - FROM study."Blood Draws" draws - WHERE draws.id=bi.id - AND draws.date >= TIMESTAMPADD('SQL_TSI_DAY', -29, bi.date) - AND cast(draws.date as date) <= bi.date - AND (draws.qcstate.metadata.DraftData = true OR draws.qcstate.publicdata = true) - --when counting backwards, dont include this date - --AND (draws.date != bi.date and draws.qcstate.label != bi.status) - ), 0 ) - ) AS BloodLast30 - , ( COALESCE ( - (SELECT SUM(coalesce(draws.quantity, 0)) AS _expr - FROM study."Blood Draws" draws - WHERE draws.id=bi.id - AND draws.date <= TIMESTAMPADD('SQL_TSI_DAY', 29, bi.date) - AND cast(draws.date as date) >= bi.date - --AND draws.date BETWEEN bi.date AND TIMESTAMPADD('SQL_TSI_DAY', 29, bi.date) - AND (draws.qcstate.metadata.DraftData = true OR draws.qcstate.publicdata = true) - --when counting forwards, dont include this date - --AND (draws.date != bi.date and draws.qcstate.label != bi.status) - ), 0 ) - ) AS BloodNext30 - from ( - SELECT - b.id, - --b.id.dataset.demographics.species as species, - cast(b.date as date) as date, - --b.lsid, - --b.qcstate, - b.qcstate.label as status, - SUM(coalesce(b.quantity, 0)) as quantity - FROM study.blood b - WHERE cast(b.date as date) >= TIMESTAMPADD('SQL_TSI_DAY', -29, now()) - AND (b.qcstate.metadata.DraftData = true OR b.qcstate.publicdata = true) - group by b.id, cast(b.date as date), b.qcstate.label - - UNION ALL - SELECT - b.id, - --b.id.dataset.demographics.species as species, - TIMESTAMPADD('SQL_TSI_DAY', 30, cast(cast(b.date as date) as timestamp)) as date, - --null as lsid, - --null as qcstate, - null as status, - 0 as quantity - FROM study.blood b - WHERE cast(b.date as date) >= TIMESTAMPADD('SQL_TSI_DAY', -29, now()) - AND (b.qcstate.metadata.DraftData = true OR b.qcstate.publicdata = true) - GROUP BY b.id, cast(b.date as date) - - --add one row per animal, showing todays date - UNION ALL - SELECT - b.id, - --b.species, - curdate() as date, - --null as lsid, - --null as qcstate, - null as status, - 0 as quantity - FROM study.demographics b - --WHERE b.id.status.status = 'Alive' - ) bi - ) b - ) bq - diff --git a/WNPRC_EHR/resources/queries/study/Current Blood/.qview.xml b/WNPRC_EHR/resources/queries/study/Current Blood/.qview.xml deleted file mode 100644 index 33013bb26..000000000 --- a/WNPRC_EHR/resources/queries/study/Current Blood/.qview.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WNPRC_EHR/resources/queries/study/bloodDrawChanges.sql b/WNPRC_EHR/resources/queries/study/bloodDrawChanges.sql new file mode 100644 index 000000000..f91415d21 --- /dev/null +++ b/WNPRC_EHR/resources/queries/study/bloodDrawChanges.sql @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +--this query is designed to return any dates when allowable blood draw volume changes +--this includes dates of blood draws, plus the date those draws drop off +PARAMETERS(DATE_INTERVAL INTEGER DEFAULT 30) + +SELECT + b2.id, + b2.status, + b2.dateOnly, + b2.quantity, + DATE_INTERVAL as blood_draw_interval, + TIMESTAMPADD('SQL_TSI_DAY', (-1 * DATE_INTERVAL), b2.dateOnly) as minDate, + TIMESTAMPADD('SQL_TSI_DAY', DATE_INTERVAL, b2.dateOnly) as maxDate, + +FROM ( + SELECT + b.id, + b.dateOnly, + b.status, + sum(b.quantity) as quantity + + FROM ( + --find all blood draws within the interval, looking backwards + SELECT + b.id, + b.qcstate as status, + b.dateOnly, + b.quantity, + FROM study.blood b + WHERE b.dateOnly > timestampadd('SQL_TSI_DAY', -1 * DATE_INTERVAL, curdate()) + + UNION ALL + + --join 1 row for the current date + SELECT + d1.id, + null as status, + curdate() as dateOnly, + 0 as quantity, + FROM study.demographics d1 + WHERE d1.calculated_status = 'Alive' + + UNION ALL + + --add one row for each date when the draw drops off the record + SELECT + b.id, + null as status, + timestampadd('SQL_TSI_DAY', DATE_INTERVAL, b.dateOnly), + 0 as quantity, + FROM study.blood b + WHERE timestampadd('SQL_TSI_DAY', DATE_INTERVAL, b.dateOnly) >= timestampadd('SQL_TSI_DAY', -1 * DATE_INTERVAL, curdate()) + + ) b + + GROUP BY b.id, b.dateOnly, b.status +) b2 \ No newline at end of file diff --git a/WNPRC_EHR/resources/queries/study/bloodSummary.query.xml b/WNPRC_EHR/resources/queries/study/bloodSummary.query.xml index b8a667e34..c5163f487 100644 --- a/WNPRC_EHR/resources/queries/study/bloodSummary.query.xml +++ b/WNPRC_EHR/resources/queries/study/bloodSummary.query.xml @@ -1,36 +1,36 @@ - - - - - - - true - - - - Drawn in Previous 30 Days (inclusive) - /query/executeQuery.view?schemaName=study& - query.queryName=Blood Draws& - query.viewName=Blood Summary& - query.Id~eq=${Id}& - query.Date~lte=${Date}& - query.Date~gte=${minDate}& - query.sort=-Date& - - - - Scheduled in Next 30 Days (inclusive) - /query/executeQuery.view?schemaName=study& - query.queryName=Blood Draws& - query.viewName=Blood Summary& - query.Id~eq=${Id}& - query.Date~gt=${Date}& - query.sort=-Date& - - - - BloodLast30 -
-
-
-
+ + + + + + + true + + + + Drawn in Previous 30 Days (including today) + /query/executeQuery.view?schemaName=study& + query.queryName=Blood Draws& + query.viewName=Blood Summary& + query.Id~eq=${Id}& + query.Date~lte=${Date}& + query.Date~gte=${minDate}& + query.sort=-Date& + + + + Scheduled in Next 30 Days (excluding today) + /query/executeQuery.view?schemaName=study& + query.queryName=Blood Draws& + query.viewName=Blood Summary& + query.Id~eq=${Id}& + query.Date~gt=${Date}& + query.sort=-Date& + + + + BloodLast30 +
+
+
+
diff --git a/WNPRC_EHR/resources/queries/study/bloodSummary.sql b/WNPRC_EHR/resources/queries/study/bloodSummary.sql index 29754e3f8..1e486d444 100644 --- a/WNPRC_EHR/resources/queries/study/bloodSummary.sql +++ b/WNPRC_EHR/resources/queries/study/bloodSummary.sql @@ -1,80 +1,69 @@ -/* - * Copyright (c) 2010-2013 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -SELECT - bq.lsid, - bq.id, - bq.date, - bq.minDate, --- bq.maxDate, - bq.weight, - bq.lastWeighDate, - cast(bq.BloodLast30 as numeric) as BloodLast30, --- bq.BloodNext30, --- round(bq.weight*0.2*60, 1) AS MaxBlood, --- round((bq.weight*0.2*60) - bq.BloodLast30, 1) AS AvailBlood - cast(CASE - WHEN bq.species = 'Marmoset' - THEN round(bq.weight*0.15*60, 1) - ELSE - round(bq.weight*0.2*60, 1) - END as numeric) AS MaxBlood, - cast(CASE - WHEN bq.species = 'Marmoset' - THEN round((bq.weight*0.15*60) - bq.BloodLast30, 1) - ELSE - round((bq.weight*0.2*60) - bq.BloodLast30, 1) - END AS numeric) AS AvailBlood -FROM -( - SELECT - b.*, - (select species from study.demographics d where d.id = b.id) as species, - ( - CONVERT ( - (SELECT AVG(w.weight) AS _expr - FROM study.weight w - WHERE w.id=b.id AND w.date=b.lastWeighDate - AND w.qcstate.publicdata = true - ), double ) - ) AS weight - FROM - ( - SELECT bi.* - ,timestampadd('SQL_TSI_DAY', -29, bi.date) as minDate --- ,timestampadd('SQL_TSI_DAY', 29, bi.date) as maxDate - , ( CONVERT( - (SELECT MAX(w.date) as _expr - FROM study.weight w - WHERE w.id = bi.id - --NOTE: we are doing this comparison such that it considers date only, not datetime - --AND w.date <= bi.date - AND CAST(CAST(w.date AS DATE) AS TIMESTAMP) <= bi.date - AND w.qcstate.publicdata = true - ), timestamp ) - ) AS lastWeighDate - , ( COALESCE ( - (SELECT SUM(draws.quantity) AS _expr - FROM study."Blood Draws" draws - WHERE draws.id=bi.id - --AND draws.date BETWEEN TIMESTAMPADD('SQL_TSI_DAY', -30, bi.date) AND bi.date - AND (cast(draws.date as date) >= cast(TIMESTAMPADD('SQL_TSI_DAY', -29, bi.date) as date) AND cast(draws.date as date) <= cast(bi.date as date)) - AND (draws.qcstate.metadata.DraftData = true OR draws.qcstate.publicdata = true) - --AND draws.qcstate.publicdata = true - ), 0 ) - ) AS BloodLast30 --- , ( COALESCE ( --- (SELECT SUM(draws.quantity) AS _expr --- FROM study."Blood Draws" draws --- WHERE draws.id=bi.id --- AND draws.date BETWEEN TIMESTAMPADD('SQL_TSI_DAY', 30, bi.date) AND bi.date --- AND (draws.qcstate.metadata.DraftData = true OR draws.qcstate.publicdata = true) --- ), 0 ) --- ) AS BloodNext30 - FROM study.blood bi - --WHERE (bi.qcstate.metadata.DraftData = true OR bi.qcstate.publicdata = true) - ) b - ) bq - +/* + * Copyright (c) 2010-2013 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +SELECT + bq.lsid, + bq.id, + bq.date, + bq.minDate, +-- bq.maxDate, + bq.weight, + bq.lastWeighDate, + cast(bq.BloodLast30 as numeric) as BloodLast30, + bq.BloodNext30, +-- round(bq.weight*0.2*60, 1) AS MaxBlood, +-- round((bq.weight*0.2*60) - bq.BloodLast30, 1) AS AvailBlood + cast(round((bq.weight*(species.max_draw_pct)*(species.blood_per_kg)), 1) as numeric) AS MaxBlood, + cast(round((bq.weight*(species.max_draw_pct)*(species.blood_per_kg)) - bq.BloodLast30, 1) AS numeric) AS AvailBlood +FROM +( + SELECT + b.*, + d.species as species, + ( + CONVERT ( + (SELECT AVG(w.weight) AS _expr + FROM study.weight w + WHERE w.id=b.id AND w.date=b.lastWeighDate + ), double ) + ) AS weight + FROM + ( + SELECT bi.* + ,timestampadd('SQL_TSI_DAY', -30, bi.date) as minDate +-- ,timestampadd('SQL_TSI_DAY', 29, bi.date) as maxDate + , ( CONVERT( + (SELECT MAX(w.date) as _expr + FROM study.weight w + WHERE w.id = bi.id + --NOTE: we are doing this comparison such that it considers date only, not datetime + --AND w.date <= bi.date + AND CAST(CAST(w.date AS DATE) AS TIMESTAMP) <= bi.date + ), timestamp ) + ) AS lastWeighDate + , ( COALESCE ( + (SELECT SUM(draws.quantity) AS _expr + FROM study."Blood Draws" draws + WHERE draws.id=bi.id + AND (cast(draws.date as date) >= cast(TIMESTAMPADD('SQL_TSI_DAY', -30, bi.date) as date) AND cast(draws.date as date) <= cast(bi.date as date)) + --AND draws.qcstate.publicdata = true + ), 0 ) + ) AS BloodLast30, + COALESCE (( + SELECT + SUM(draws.quantity) AS _expr + FROM study."Blood Draws" draws + WHERE draws.id=bi.id AND + (cast(draws.date as date) <= cast(TIMESTAMPADD('SQL_TSI_DAY', 30, bi.date) as date) AND cast(draws.date as date) > cast(bi.date as date) ) + + ), 0) AS BloodNext30 + FROM study.blood bi + + --WHERE (bi.qcstate.metadata.DraftData = true OR bi.qcstate.publicdata = true) + ) b + + JOIN study.demographics d ON b.id = d.id + ) bq + diff --git a/WNPRC_EHR/resources/queries/study/Current Blood.query.xml b/WNPRC_EHR/resources/queries/study/currentBloodDraws.query.xml similarity index 53% rename from WNPRC_EHR/resources/queries/study/Current Blood.query.xml rename to WNPRC_EHR/resources/queries/study/currentBloodDraws.query.xml index a37953f2a..cf0b8081c 100644 --- a/WNPRC_EHR/resources/queries/study/Current Blood.query.xml +++ b/WNPRC_EHR/resources/queries/study/currentBloodDraws.query.xml @@ -1,70 +1,83 @@ - - - - - - - true - - - - - study - Animal - Id - - - - Previous 30 Days (inclusive) - /query/executeQuery.view?schemaName=study& - query.queryName=Blood Draws& - query.viewName=Blood Summary& - query.Id~eq=${Id}& - query.Date~datelte=${Date}& - query.Date~dategte=${minDate}& - query.sort=-Date& - - - - Next 30 Days (inclusive) - /query/executeQuery.view?schemaName=study& - query.queryName=Blood Draws& - query.viewName=Blood Summary& - query.Id~eq=${Id}& - query.Date~dategte=${Date}& - query.sort=-Date& - - - - Latest Weight (kg) - /query/executeQuery.view?schemaName=study& - query.queryName=Weight& - query.Id~eq=${Id}& - query.wDate~gt=${wDate}& - query.sort=-Date& - - - - yyyy-MM-dd - - - yyyy-MM-dd - - - yyyy-MM-dd - - - yyyy-MM-dd HH:mm - - - 20% Volume By Weight - - - Volume Remaining After Draw (mL) - - - BloodLast30 -
-
-
-
+ + + + + + + true + + + + + study + Animal + Id + + + + Status + + core + qcstate + rowid + + + + Previous 30 Days (including today) + /query/executeQuery.view?schemaName=study& + query.queryName=Blood Draws& + query.viewName=Blood Summary& + query.Id~eq=${Id}& + query.Date~datelte=${Date}& + query.Date~dategte=${minDate}& + query.sort=-Date& + + This shows the amount of blood draws taken in the past, including today. + + + Next 30 Days (excluding today) + /query/executeQuery.view?schemaName=study& + query.queryName=Blood Draws& + query.viewName=Blood Summary& + query.Id~eq=${Id}& + query.Date~dategte=${Date}& + query.sort=-Date& + + This shows the amount of blood draws scheduled in the next 30 days after the given date. + + + Latest Weight (kg) + /query/executeQuery.view?schemaName=study& + query.queryName=Weight& + query.Id~eq=${Id}& + query.wDate~gt=${wDate}& + query.sort=-Date& + + + + yyyy-MM-dd + + + yyyy-MM-dd + + + yyyy-MM-dd + + + 20% Volume By Weight + This shows the maximum blood an animal can get drawn based on their weight. + + + Volume Available Today (mL) + This shows the amount of blood remaining today. It includes blood draws that happened 30 days in the past up to today. + + + Volume Remaining After All Draws (mL) + /WNPRC/EHR/ehr-animalHistory.view#subjects:${Id}&inputType:singleSubject&showReport:1&activeReport:BloodSummary + This column shows the amount of blood remaining for the animal while considering future draws. It includes approved blood draws 30 days into the future and past blood draws 30 days in the past. + + +
+
+
+
diff --git a/WNPRC_EHR/resources/queries/study/currentBloodDraws.sql b/WNPRC_EHR/resources/queries/study/currentBloodDraws.sql new file mode 100644 index 000000000..f90605794 --- /dev/null +++ b/WNPRC_EHR/resources/queries/study/currentBloodDraws.sql @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2016 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +SELECT + t.id, + t.date, + t.status, + cast(t.quantity as double) as quantity, + t.species, + t.max_draw_pct, + t.blood_draw_interval, + t.blood_per_kg, + t.mostRecentWeight, + t.mostRecentWeightDate, + t.death, + cast(round(t.allowableBlood,1) as numeric) as maxAllowableBlood, + cast(t.bloodPrevious as double) as bloodPrevious, + cast((t.allowableBlood - t.bloodPrevious) as double) as allowablePrevious, + + cast(t.bloodFuture as double) as bloodFuture, + cast((t.allowableBlood - t.bloodFuture) as double) as allowableFuture, + + ROUND(CAST((t.allowableBlood - t.bloodPrevious) AS double),1) as allowableBlood, + ROUND(CAST((t.allowableBlood - t.bloodPrevious - t.bloodFuture) AS double),1) as allowableBloodIncludingFutureDraws, + t.minDate, + t.maxDate + +FROM ( + + SELECT + bd.id, + bd.status, + bd.dateOnly as date, + bd.quantity, + d.species, + d.death, + ( + CONVERT ( + (SELECT AVG(w.weight) AS _expr + FROM study.weight w + WHERE w.id=bd.id AND w.date=d.id.mostRecentWeight.MostRecentWeightDate + AND w.qcstate.publicdata = true + ), double ) + ) * d.species.max_draw_pct * d.species.blood_per_kg AS allowableBlood, + + (CONVERT ( + (SELECT AVG(w.weight) AS _expr + FROM study.weight w + WHERE w.id=bd.id AND w.date=d.id.mostRecentWeight.MostRecentWeightDate + AND w.qcstate.publicdata = true + ), double ) ) as weight, + d.id.mostRecentWeight.MostRecentWeight, + d.id.mostRecentWeight.MostRecentWeightDate, + d.species.blood_per_kg, + d.species.max_draw_pct, + bd.blood_draw_interval, + bd.minDate, + bd.maxDate, + COALESCE( + (SELECT SUM(coalesce(draws.quantity, 0)) AS _expr + FROM study."Blood Draws" draws + WHERE draws.id = bd.id + AND draws.dateOnly > bd.minDate + AND draws.dateOnly <= bd.dateOnly + --NOTE: this has been changed to include pending/non-approved draws + AND draws.countsAgainstVolume = true + ), 0) AS BloodPrevious, + + COALESCE( + (SELECT SUM(coalesce(draws.quantity, 0)) AS _expr + FROM study."Blood Draws" draws + WHERE draws.id = bd.id + AND draws.dateOnly < bd.maxDate + AND draws.dateOnly > bd.dateOnly + --NOTE: this has been changed to include pending/non-approved draws + AND draws.countsAgainstVolume = true + ), 0) AS BloodFuture, + +COALESCE( + (SELECT SUM(coalesce(draws.quantity, 0)) AS _expr + FROM study."Blood Draws" draws + WHERE draws.id = bd.id + AND draws.dateOnly = curdate() + --NOTE: this has been changed to include pending/non-approved draws + AND draws.countsAgainstVolume = true + ), 0) AS BloodToday + + FROM study.bloodDrawChanges bd + JOIN study.demographics d ON (d.id = bd.id) + + ) t \ No newline at end of file diff --git a/WNPRC_EHR/resources/queries/study/currentBloodDraws/.qview.xml b/WNPRC_EHR/resources/queries/study/currentBloodDraws/.qview.xml new file mode 100644 index 000000000..22719345e --- /dev/null +++ b/WNPRC_EHR/resources/queries/study/currentBloodDraws/.qview.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WNPRC_EHR/resources/queries/study/demographics/Blood Draw Info.qview.xml b/WNPRC_EHR/resources/queries/study/demographics/Blood Draw Info.qview.xml index 7315e444b..6b6dd23f8 100644 --- a/WNPRC_EHR/resources/queries/study/demographics/Blood Draw Info.qview.xml +++ b/WNPRC_EHR/resources/queries/study/demographics/Blood Draw Info.qview.xml @@ -62,7 +62,7 @@ - + diff --git a/WNPRC_EHR/resources/queries/study/demographicsBloodSummary.query.xml b/WNPRC_EHR/resources/queries/study/demographicsBloodSummary.query.xml index e680dda90..d90021b23 100644 --- a/WNPRC_EHR/resources/queries/study/demographicsBloodSummary.query.xml +++ b/WNPRC_EHR/resources/queries/study/demographicsBloodSummary.query.xml @@ -1,63 +1,52 @@ - - - - - - - true - true - - - true - - - /query/executeQuery.view?schemaName=study& - query.queryName=Blood Draws& - query.viewName=Blood Summary& - query.Id~eq=${Id}& - query.Date~lte=${Date}& - query.sort=-Date& - - Blood Drawn In Previous 30 Days - - - Scheduled in Next 30 Days - /query/executeQuery.view?schemaName=study& - query.queryName=Blood Draws& - query.viewName=Blood Summary& - query.Id~eq=${Id}& - query.Date~gt=${Date}& - query.sort=-Date& - - - - Max Blood Per 30 Days (mL) - - - Available Blood (mL) - - - - - - FF0000 - - - - - Current Blood (mL) - - - - - - FBEC5D - - - - - AvailBlood -
-
-
-
+ + + + + + + true + true + + + true + + + /query/executeQuery.view?schemaName=study& + query.queryName=Blood Draws& + query.viewName=Blood Summary& + query.Id~eq=${Id}& + query.Date~lte=${Date}& + query.sort=-Date& + + Blood Drawn In Previous 30 Days + + + Scheduled in Next 30 Days + /query/executeQuery.view?schemaName=study& + query.queryName=Blood Draws& + query.viewName=Blood Summary& + query.Id~eq=${Id}& + query.Date~gt=${Date}& + query.sort=-Date& + + + + Max Blood Per 30 Days (mL) + + + Available Blood (mL) + + + + + + FF0000 + + + + + AvailBlood +
+
+
+
\ No newline at end of file diff --git a/WNPRC_EHR/resources/queries/study/demographicsBloodSummary.sql b/WNPRC_EHR/resources/queries/study/demographicsBloodSummary.sql index dcf9fd08c..fad214145 100644 --- a/WNPRC_EHR/resources/queries/study/demographicsBloodSummary.sql +++ b/WNPRC_EHR/resources/queries/study/demographicsBloodSummary.sql @@ -1,87 +1,61 @@ - - -/* - * Copyright (c) 2010-2014 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -SELECT - b.lsid, - b.id, - --b.date, - b.wdate as MostRecentWeightDate, - b.weight as MostRecentWeight, - convert(BloodLast30, float) as BloodLast30, - convert(BloodNext30, float) as BloodNext30, - convert(CASE - WHEN (b.species = 'Marmoset') - THEN (b.weight*0.15*60) - ELSE - (b.weight*0.2*60) - END, float) AS MaxBlood, - - convert(case - when (b.species = 'Marmoset') - THEN ((b.weight*0.15*60) - b.BloodLast30) - else - ((b.weight*0.2*60) - b.BloodLast30) - end, float) as CurrentBlood, - - TRUNCATE(ROUND(CAST(case - when (b.BloodLast30 > b.BloodNext30 and b.species = 'Marmoset') - THEN ((b.weight*0.15*60) - b.BloodLast30) - when (b.BloodLast30 > b.BloodNext30 and b.species != 'Marmoset') - THEN ((b.weight*0.2*60) - b.BloodLast30 -b.BloodNext30) - when (b.BloodLast30 <= b.BloodNext30 and b.species = 'Marmoset') - THEN ((b.weight*0.15*60) - b.BloodNext30) - else - ((b.weight*0.2*60) - b.BloodNext30 - b.BloodLast30) - end AS NUMERIC),2),2) as AvailBlood -from ( -SELECT - d.lsid, - d.id, - d.species, --- d.weight, --- d.wdate, - lastWeight.date as wdate, - ( - SELECT AVG(w.weight) AS _expr - FROM study.weight w - WHERE w.id=d.id AND w.date=lastWeight.date - AND w.qcstate.publicdata = true - ) AS weight, - COALESCE (( - SELECT - SUM(bd.quantity) AS _expr - FROM study."Blood Draws" bd - WHERE bd.id=d.id AND - bd.qcstate.publicdata = true AND - --bd.date BETWEEN TIMESTAMPADD('SQL_TSI_DAY', -30, now()) AND now() - (cast(bd.date as date) >= cast(TIMESTAMPADD('SQL_TSI_DAY', -30, now()) as date) AND cast(bd.date as date) <= cast(curdate() as date)) - - ), 0) AS BloodLast30, - COALESCE (( - SELECT - SUM(bd.quantity) AS _expr - FROM study."Blood Draws" bd - WHERE bd.id=d.id AND - (bd.qcstate.publicdata = true OR bd.qcstate.metadata.DraftData = true) AND - --bd.date BETWEEN now() AND TIMESTAMPADD('SQL_TSI_DAY', 30, now()) - (cast(bd.date as date) >= cast(curdate() as date) AND cast(bd.date as date) <= cast(TIMESTAMPADD('SQL_TSI_DAY', 30, now()) as date)) - - ), 0) AS BloodNext30 - -FROM - study.demographics d - LEFT OUTER JOIN - (SELECT w.id, MAX(date) as date FROM study.weight w - WHERE w.qcstate.publicdata = true - GROUP BY w.id) lastWeight ON d.id = lastWeight.id - --- WHERE b.date >= TIMESTAMPADD('SQL_TSI_DAY', -30, now()) -WHERE - -d.calculated_status = 'Alive' - + + +/* + * Copyright (c) 2010-2014 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 + */ +SELECT + b.lsid, + b.id, + --b.date, + b.wdate as MostRecentWeightDate, + b.weight as MostRecentWeight, + convert(BloodLast30, float) as BloodLast30, + convert(BloodNext30, float) as BloodNext30, + convert((b.weight*(b.species.max_draw_pct)*(b.species.blood_per_kg)), float) AS MaxBlood, + TRUNCATE(ROUND(CAST(((b.weight*(b.species.max_draw_pct)*(b.species.blood_per_kg)) - b.BloodLast30) AS NUMERIC),2),2) as AvailBlood +from ( +SELECT + d.lsid, + d.id, + d.species, +-- d.weight, +-- d.wdate, + lastWeight.date as wdate, + ( + SELECT AVG(w.weight) AS _expr + FROM study.weight w + WHERE w.id=d.id AND w.date=lastWeight.date + ) AS weight, + COALESCE (( + SELECT + SUM(bd.quantity) AS _expr + FROM study."Blood Draws" bd + WHERE bd.id=d.id AND + --bd.date BETWEEN TIMESTAMPADD('SQL_TSI_DAY', -30, now()) AND now() + (cast(bd.date as date) >= cast(TIMESTAMPADD('SQL_TSI_DAY', -30, now()) as date) AND cast(bd.date as date) <= cast(curdate() as date)) + + ), 0) AS BloodLast30, + COALESCE (( + SELECT + SUM(bd.quantity) AS _expr + FROM study."Blood Draws" bd + WHERE bd.id=d.id AND + --bd.date BETWEEN now() AND TIMESTAMPADD('SQL_TSI_DAY', 30, now()) + (cast(bd.date as date) > cast(curdate() as date) AND cast(bd.date as date) <= cast(TIMESTAMPADD('SQL_TSI_DAY', 30, now()) as date)) + + ), 0) AS BloodNext30 + +FROM + study.demographics d + LEFT OUTER JOIN + (SELECT w.id, MAX(date) as date FROM study.weight w + GROUP BY w.id) lastWeight ON d.id = lastWeight.id + +-- WHERE b.date >= TIMESTAMPADD('SQL_TSI_DAY', -30, now()) +WHERE + +d.calculated_status = 'Alive' + ) b \ No newline at end of file diff --git a/WNPRC_EHR/resources/web/ehr/ext3/ehrStore.js b/WNPRC_EHR/resources/web/ehr/ext3/ehrStore.js index 4ce13bc69..708226c66 100644 --- a/WNPRC_EHR/resources/web/ehr/ext3/ehrStore.js +++ b/WNPRC_EHR/resources/web/ehr/ext3/ehrStore.js @@ -667,7 +667,7 @@ EHR.ext.AdvancedStore = Ext.extend(LABKEY.ext.Store, { // top-level request, rather than only per-blood. in this instance only Blood Draws.js // is using the data, but weights are a good example of something that might be // globally useful. - if (this.queryName == 'Blood Draws'){ + if (this.queryName == 'blood'){ var bloodDrawMap = {}; var allRecords = this.getAllRecords(); for (var idx = 0; idx < allRecords.length; ++idx){ diff --git a/WNPRC_EHR/resources/web/wnprc_ehr/wnprcReports.js b/WNPRC_EHR/resources/web/wnprc_ehr/wnprcReports.js index b9e718175..2bebd2370 100644 --- a/WNPRC_EHR/resources/web/wnprc_ehr/wnprcReports.js +++ b/WNPRC_EHR/resources/web/wnprc_ehr/wnprcReports.js @@ -661,6 +661,26 @@ EHR.reports.diagnostics = function(panel, tab){ }); }; +EHR.reports.currentBloodDraws = function(panel, tab) { + var filterArray = panel.getFilterArray(tab); + var title = panel.getTitleSuffix(); + + var config = panel.getQWPConfig({ + schemaName: 'study', + queryName: 'currentBloodDraws', + title: "Current Blood " + title, + parameters: {'interval': '30'}, + filters: filterArray.nonRemovable, + removeableFilters: filterArray.removable + }); + + tab.add({ + xtype: 'ldk-querycmp', + style: 'margin-bottom:20px;', + queryConfig: config + }); +} + EHR.reports.bloodChemistry = function(panel, tab){ var filterArray = panel.getFilterArray(tab); var title = panel.getTitleSuffix(); @@ -1247,6 +1267,33 @@ EHR.reports['abstract'] = function(panel, tab){ EHR.reports.weightGraph(panel, tab); }; +EHR.reports.BloodSummary = function(panel, tab){ + tab.add({ + html: 'This report summarizes the blood available for the animals below. ' + + '

If there have been recent blood draws for the animal, a graph will show the available blood over time. On the graph, dots indicate dates when either blood was drawn or a previous blood draw fell off. The horizontal lines indicate the maximum allowable blood that can be drawn on that date.', + border: false, + style: 'padding-bottom: 20px;' + }); + + var subjects = tab.filters.subjects || []; + + if (subjects.length){ + tab.add({ + xtype: 'ehr-bloodsummarypanel', + subjects: subjects + }); + } + else + { + panel.resolveSubjectsFromHousing(tab, function(subjects, tab){ + tab.add({ + xtype: 'ehr-bloodsummarypanel', + subjects: subjects + }); + }, this); + } +}; + (function() { var abstractReport = EHR.reports['abstract'];