diff --git a/GeneticsCore/resources/etls/MHC_Typing.xml b/GeneticsCore/resources/etls/MHC_Typing.xml index 1b8134db3..9e93c1e25 100644 --- a/GeneticsCore/resources/etls/MHC_Typing.xml +++ b/GeneticsCore/resources/etls/MHC_Typing.xml @@ -11,6 +11,7 @@ marker result assaytype + librarytype score totalTests objectid diff --git a/GeneticsCore/resources/queries/geneticscore/mhc_data_source.sql b/GeneticsCore/resources/queries/geneticscore/mhc_data_source.sql index d66017d3f..ea6f7a8c0 100644 --- a/GeneticsCore/resources/queries/geneticscore/mhc_data_source.sql +++ b/GeneticsCore/resources/queries/geneticscore/mhc_data_source.sql @@ -13,6 +13,7 @@ SELECT s.totalRecords as totalTests, s.status as result, cast('SSP' as varchar) as assaytype, + 'N/A' as librarytype, NULL as score FROM assay.SSP_assay.SSP.SSP_Summary s @@ -27,6 +28,7 @@ SELECT count(*) as totalTests, cast('POS' as varchar) as result, cast('SBT' as varchar) as assaytype, + group_concat(DISTINCT a.analysisId.readset.libraryType, ',') as librarytype, sum(a.result) / (SELECT count(DISTINCT a2.analysisId) as total FROM assay.GenotypeAssay.Genotype.Data a2 WHERE a2.subjectId = a.subjectId AND a2.run.assayType = 'SBT' ) AS score, FROM assay.GenotypeAssay.Genotype.Data a @@ -42,6 +44,7 @@ DISTINCT s.subjectId, 1 as totalTests, cast('NEG' as varchar) as result, cast('SBT' as varchar) as assaytype, + null as librarytype, NULL as score, --we want any IDs with SBT data, but lacking data for these special-cased markers diff --git a/GeneticsCore/resources/schemas/dbscripts/postgresql/geneticscore-17.14-17.15.sql b/GeneticsCore/resources/schemas/dbscripts/postgresql/geneticscore-17.14-17.15.sql new file mode 100644 index 000000000..9bbbd6300 --- /dev/null +++ b/GeneticsCore/resources/schemas/dbscripts/postgresql/geneticscore-17.14-17.15.sql @@ -0,0 +1 @@ +ALTER TABLE geneticscore.mhc_data ADD librarytype varchar(1000); \ No newline at end of file diff --git a/GeneticsCore/resources/schemas/dbscripts/sqlserver/geneticscore-17.14-17.15.sql b/GeneticsCore/resources/schemas/dbscripts/sqlserver/geneticscore-17.14-17.15.sql new file mode 100644 index 000000000..44938f852 --- /dev/null +++ b/GeneticsCore/resources/schemas/dbscripts/sqlserver/geneticscore-17.14-17.15.sql @@ -0,0 +1 @@ +ALTER TABLE geneticscore.mhc_data ADD libraryType varchar(1000); \ No newline at end of file diff --git a/GeneticsCore/resources/schemas/geneticscore.xml b/GeneticsCore/resources/schemas/geneticscore.xml index edd583b0f..b6e75f073 100644 --- a/GeneticsCore/resources/schemas/geneticscore.xml +++ b/GeneticsCore/resources/schemas/geneticscore.xml @@ -44,6 +44,9 @@ Assay Type + + Library Type + Key true diff --git a/GeneticsCore/resources/views/mhcDataDashboard.html b/GeneticsCore/resources/views/mhcDataDashboard.html index 8ca2fcdb5..baabebe4e 100644 --- a/GeneticsCore/resources/views/mhcDataDashboard.html +++ b/GeneticsCore/resources/views/mhcDataDashboard.html @@ -86,6 +86,12 @@ schemaName: 'geneticscore', queryName: 'mhc_data' }) + },{ + name: 'Manage Library Types', + url: LABKEY.ActionURL.buildURL('query', 'executeQuery.view', null, { + schemaName: 'sequenceanalysis', + queryName: 'library_types' + }) }] },{ header: 'Data Archival', diff --git a/GeneticsCore/src/org/labkey/GeneticsCore/GeneticsCoreModule.java b/GeneticsCore/src/org/labkey/GeneticsCore/GeneticsCoreModule.java index 4bc8cdea1..dd534e5e1 100644 --- a/GeneticsCore/src/org/labkey/GeneticsCore/GeneticsCoreModule.java +++ b/GeneticsCore/src/org/labkey/GeneticsCore/GeneticsCoreModule.java @@ -40,7 +40,7 @@ public String getName() @Override public @Nullable Double getSchemaVersion() { - return 17.14; + return 17.15; } @Override diff --git a/GeneticsCore/src/org/labkey/GeneticsCore/mhc/MhcTaskRef.java b/GeneticsCore/src/org/labkey/GeneticsCore/mhc/MhcTaskRef.java index 91aeaee97..67c77dae4 100644 --- a/GeneticsCore/src/org/labkey/GeneticsCore/mhc/MhcTaskRef.java +++ b/GeneticsCore/src/org/labkey/GeneticsCore/mhc/MhcTaskRef.java @@ -159,7 +159,7 @@ private void processSubject(PipelineJob job, String subject) throws PipelineJobE } List> toInsert = new ArrayList<>(); - Set fields = PageFlowUtil.set("subjectid", "marker", "result", "assaytype", "totalTests", "score"); + Set fields = PageFlowUtil.set("subjectid", "marker", "result", "assaytype", "totalTests", "score", "librarytype"); new TableSelector(us.getTable("mhc_data_source"), fields, new SimpleFilter(FieldKey.fromString("subjectId"), subject), null).forEachResults(rs -> { CaseInsensitiveHashMap map = new CaseInsensitiveHashMap<>(); for (String f : fields) diff --git a/ONPRC_EHR_ComplianceDB/module.properties b/ONPRC_EHR_ComplianceDB/module.properties index 7c901fa67..d6cafdc82 100644 --- a/ONPRC_EHR_ComplianceDB/module.properties +++ b/ONPRC_EHR_ComplianceDB/module.properties @@ -1,4 +1,4 @@ Name: ONPRC_EHR_ComplianceDB ModuleClass: org.labkey.ONPRCEHR_ComplianceDB.ONPRC_EHR_ComplianceDBModule -SupportedDatabases: mssql -ManageVersion: false +SupportedDatabases: mssql, pgsql +ManageVersion: true diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg.query.xml b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg.query.xml deleted file mode 100644 index b3e75afd8..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg.query.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - Employee Requirement Summary -- Original version - - - Employee ID - true - - ehr_compliancedb - employees - employeeId - - - - - Row ID - - - Requirement Name - 250 - - ehr_compliancedb - requirements - requirementName - - ALWAYS_OFF - - - Times Completed - 50 - /query/executeQuery.view?schemaName=ehr_compliancedb& - query.queryName=CompletionDates& - query.EmployeeId~eq=${employeeId}& - query.requirementName~eq=${requirementName}& - - - - Expire Period (Months) - 70 - - - New Expire Period (Months) - 70 - - - - Email - 70 - - - - Last Name - 110 - - - - First Name - 110 - - - - Host - 110 - - - Supervisor - 150 - - - - Unit - 210 - - - Most Recent Date - yyyy-MM-dd - 70 - - - Comments - 70 - - - Category - 70 - - - - Trainee Type - 70 - - - Requirement Name Type - 180 - - - Months Until Renewal - 60 - - - - - - FBEC5D - - - - - - Essential - 60 - ALWAYS_OFF - - - Snooze Until - 60 - ALWAYS_OFF - - - -
-
-
-
diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg.sql b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg.sql deleted file mode 100644 index 16ce9a184..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg.sql +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2025-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - --- Modified: 6-14-2022 R.Blasa ComplianceRecentTests.sql --- Training that was completed by an employee and being recorded as completed as a Unit or Category -select b.requirementname, - a.employeeid, - group_concat(distinct a.unit,chr(10)) as unit, - group_concat(distinct a.category,chr(10)) as category, - group_concat(distinct b.trackingflag) as trackingflag, - - - (select count(zz.date) from completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select group_concat(distinct yy.comment, chr(10)) from completiondates yy where yy.date in (select max(zz.date) from completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, - (Select group_concat(distinct yy.snooze_date , chr(10)) from completiondates yy where yy.date in (select max(zz.date) from completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - - WHEN (select max(st.date) from completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) ) > 0 THEN - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate) - (TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now()) ) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) - - - ELSE ( select (tt.expireperiod) - ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS DECIMAL ) AS MonthsUntilRenewal - - - -from employeeperunit a ,requirementspercategory b -where ( a.unit = b.unit or a.category = b.category ) - And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And b.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where p.enddate is null) - And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) - - - - - group by b.requirementname,a.employeeid - - -union - --- Training that was completed by an employee but not recorded as being completed as a Unit or Category -select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'No' as trackingflag, - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select group_concat(distinct yy.comment, chr(10)) from completiondates yy where yy.date in (select max(zz.date) from completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select group_concat(distinct yy.snooze_date , chr(10)) from completiondates yy where yy.date in (select max(zz.date) from completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) ) > 0 THEN - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate) - ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now()) ) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) - - - - - ELSE ( select (tt.expireperiod) - ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS DECIMAL) AS MonthsUntilRenewal - - - from ehr_compliancedb.completiondates a -where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And a.employeeid = k.employeeid ) - And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And a.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - -group by a.requirementname,a.employeeid - -UNION - --- Additional requirements for employees that have not completed training, but is required -select j.requirementname, - j.employeeid, - null as unit, - null as category, - 'Yes' as trackingflag, - null as timesCompleted, - null as ExpiredPeriod, - null as NewExpirePeriod, - null as MostRecentDate, - '' as comment, - null as snooze_date, - null AS MonthsUntilRenewal - - -from ehr_compliancedb.RequirementsPerEmployee j -Where j.requirementname not in (select z.requirementname from ehr_compliancedb.completiondates z where z.requirementname = j.requirementname - and z.employeeid = j.employeeid and z.date is not null) - And j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where p.enddate is null) - And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) - - - -group by j.requirementname,j.employeeid - - - - - diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/.qview.xml b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/.qview.xml deleted file mode 100644 index 82fc59d49..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/.qview.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/Occupational Health Compliance.qview.xml b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/Occupational Health Compliance.qview.xml deleted file mode 100644 index 97934dc5a..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/Occupational Health Compliance.qview.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/Overdue and Due Soon withNoEHRS OccHealth.qview.xml b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/Overdue and Due Soon withNoEHRS OccHealth.qview.xml deleted file mode 100644 index 192608c90..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/Overdue and Due Soon withNoEHRS OccHealth.qview.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/Overdue and Due Soon.qview.xml b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/Overdue and Due Soon.qview.xml deleted file mode 100644 index bc93d1734..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceProcedureRecentTestsorg/Overdue and Due Soon.qview.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceRecentTestsorg.query.xml b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceRecentTestsorg.query.xml deleted file mode 100644 index 46cb8fc00..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceRecentTestsorg.query.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - Employee Requirement Summary - Original version - - - Employee ID - true - - ehr_compliancedb - employees - employeeId - - - - - Row ID - - - Requirement Name - 90 - - ehr_compliancedb - requirements - requirementName - - ALWAYS_OFF - - - Times Completed - 50 - /query/executeQuery.view?schemaName=ehr_compliancedb& - query.queryName=CompletionDates& - query.EmployeeId~eq=${employeeId}& - query.requirementName~eq=${requirementName}& - - - - Expire Period (Months) - 70 - - - New Expire Period (Months) - 70 - - - - Email - 70 - - - - Last Name - 110 - - - - First Name - 110 - - - - Host - 110 - - - Supervisor - 150 - - - - Unit - 210 - - - Most Recent Date - yyyy-MM-dd - 70 - - - Comments - 70 - - - Category - 70 - - - - Trainee Type - 70 - - - Requirement Name Type - 180 - - - Months Until Renewal - 60 - - - - - - FBEC5D - - - - - - Essential - 60 - ALWAYS_OFF - - - -
-
-
-
diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceRecentTestsorg.sql b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceRecentTestsorg.sql deleted file mode 100644 index 3226ee975..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceRecentTestsorg.sql +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2025-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - --- Modified: 6-14-2022 R.Blasa ComplianceRecentTests.sql --- Training that was completed by an employee and being recorded as completed as a Unit or Category -select b.requirementname, - a.employeeid, - group_concat(distinct b.unit,chr(10)) as unit, - group_concat(distinct a.category,chr(10)) as category, - group_concat(distinct b.trackingflag) as trackingflag, - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select group_concat(distinct yy.comment, chr(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) ) > 0 THEN - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate) - (TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now()) ) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) - - - ELSE ( select (tt.expireperiod) - ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS double) AS MonthsUntilRenewal - - - -from employeeperunit a ,requirementspercategory b -where ( a.unit = b.unit or a.category = b.category ) - And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And b.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where p.enddate is null) - And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) - - - -group by b.requirementname,a.employeeid - -union - --- Training that was completed by an employee but not recorded as being completed as a Unit or Category -select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'No' as trackingflag, - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select group_concat(distinct yy.comment, chr(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) ) > 0 THEN - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate) - ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now()) ) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) - - - - - ELSE ( select (tt.expireperiod) - ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS double) AS MonthsUntilRenewal - -from ehr_compliancedb.completiondates a -where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And a.employeeid = k.employeeid ) - And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And a.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - -group by a.requirementname,a.employeeid - - -union - --- Training that was completed by as an employee training exemptions, and at least completed one, or more times -select j.requirementname, - j.employeeid, - null as unit, - null as category, - 'No' as trackingflag, - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = j.requirementname) as ExpiredPeriod, - - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as MostRecentDate, - - (Select group_concat(distinct yy.comment, chr(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) - And yy.requirementname= j.requirementname and yy.employeeid= j.employeeid ) as comment, - - - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = j.requirementname and st.employeeid = j.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = j.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) ) > 0 THEN - - ( select ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate) - ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now()) ) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) - - - - - ELSE ( select (tt.expireperiod) - ( TIMESTAMPDIFF('SQL_TSI_MONTH', max(pq.date), Now())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod ) - - END AS double) AS MonthsUntilRenewal - -from ehr_compliancedb.employeerequirementexemptions j - Where j.requirementname in (select z.requirementname from ehr_compliancedb.completiondates z where z.requirementname = j.requirementname - and z.employeeid = j.employeeid and z.date is not null) - And j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where p.enddate is null) - And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) - - - -group by j.requirementname,j.employeeid - -UNION - --- Additional requirements for employees that have not completed training, but is required -select j.requirementname, - j.employeeid, - null as unit, - null as category, - 'Yes' as trackingflag, - null as timesCompleted, - null as ExpiredPeriod, - null as NewExpirePeriod, - null as MostRecentDate, - '' as comment, - null AS MonthsUntilRenewal - - -from ehr_compliancedb.RequirementsPerEmployee j -Where j.requirementname NOT in (select z.requirementname from ehr_compliancedb.completiondates z where z.requirementname = j.requirementname - and z.employeeid = j.employeeid and z.date is not null) - And j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where p.enddate is null) - And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) - - - -group by j.requirementname,j.employeeid - diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceRecentTestsorg/.qview.xml b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceRecentTestsorg/.qview.xml deleted file mode 100644 index 750c4460d..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/ComplianceRecentTestsorg/.qview.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/employeeperUnit.query.xml b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/employeeperUnit.query.xml index ba8a15c67..38016fa62 100644 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/employeeperUnit.query.xml +++ b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/employeeperUnit.query.xml @@ -7,6 +7,7 @@ + /ONPRC/Admin/Compliance ehr_compliancedb employees employeeId diff --git a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/requirements.js b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/requirements.js index e1e192de8..61dda9af1 100644 --- a/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/requirements.js +++ b/ONPRC_EHR_ComplianceDB/resources/queries/EHR_ComplianceDB/requirements.js @@ -6,6 +6,7 @@ var console = require("console"); var LABKEY = require("labkey"); +var ldkUtils = require("ldk/Utils").LDK.Server.Utils; var helper = org.labkey.ldk.query.LookupValidationHelper.create(LABKEY.Security.currentContainer.id, LABKEY.Security.currentUser.id, 'ehr_compliancedb', 'requirements'); @@ -27,19 +28,7 @@ function beforeUpdate(row, oldRow, errors){ } function beforeUpsert(row, errors){ - var lookupFields = ['type']; - for (var i=0;i employees foreign key on insert. + SELECT employeeid INTO _employeeidFinal + FROM ehr_compliancedb.employees + WHERE lower(employeeid) = _employeeid AND enddate IS NULL + LIMIT 1; + + IF _employeeidFinal IS NULL THEN + UPDATE onprc_ehr_compliancedb.SciShield_Data ss + SET processed = 2 + WHERE ss.rowid = _SciShieldID; + + CONTINUE; + END IF; + + -- If all previous version were validated proceed with the record insert + IF NOT EXISTS (SELECT 1 FROM ehr_compliancedb.completiondates WHERE lower(employeeid) = _employeeid AND lower(requirementname) = lower(_requirementnameFinal) AND date = _Completiondate) THEN + INSERT INTO ehr_compliancedb.completiondates + (employeeid, requirementname, date, trainer, container, created, createdby, modified, modifiedby) + VALUES + (_employeeidFinal, _requirementnameFinal, _Completiondate, 'ONLINE TRAINING', 'cd170458-c55f-102f-9907-5107380a54be', now(), 2595, now(), 2595); + + UPDATE onprc_ehr_compliancedb.SciShield_Data ss + SET processed = 1 + WHERE ss.rowid = _SciShieldID; + END IF; + END LOOP; + + -- Create master records of the last most recent entries + IF EXISTS (SELECT 1 FROM onprc_ehr_compliancedb.SciShieldTemp) THEN + INSERT INTO onprc_ehr_compliancedb.SciShieldMasterTemp + (employeeid, requirementname, completeddate, comment, createddate, rowid) + SELECT + employeeid, + requirementname, + completeddate, + comment, + createddate, + rowid + FROM onprc_ehr_compliancedb.SciShieldTemp; + END IF; + + RETURN 0; + +EXCEPTION + WHEN OTHERS THEN + RETURN 1; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION onprc_ehr_compliancedb.p_ComplianceTranslatestringUpdate() +RETURNS integer AS $$ +BEGIN + IF EXISTS (SELECT 1 FROM ehr_compliancedb.EmployeePerUnit WHERE unit ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.EmployeePerUnit SET unit = regexp_replace(unit, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.EmployeePerUnit WHERE category ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.EmployeePerUnit SET category = regexp_replace(category, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.Employees WHERE majorudds ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.Employees SET majorudds = regexp_replace(majorudds, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.Employees WHERE unit ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.Employees SET unit = regexp_replace(unit, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.Employees WHERE category ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.Employees SET category = regexp_replace(category, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.requirements WHERE requirementname ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.requirements SET requirementname = regexp_replace(requirementname, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.EmployeeRequirementExemptions WHERE requirementname ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.EmployeeRequirementExemptions SET requirementname = regexp_replace(requirementname, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.unit_names WHERE unit ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.unit_names SET unit = regexp_replace(unit, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.RequirementsPerCategory WHERE RequirementName ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.RequirementsPerCategory SET requirementname = regexp_replace(requirementname, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.RequirementsPerCategory WHERE category ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.RequirementsPerCategory SET category = regexp_replace(category, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.RequirementsPerCategory WHERE unit ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.RequirementsPerCategory SET unit = regexp_replace(unit, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.completiondates WHERE requirementname ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.completiondates SET requirementname = regexp_replace(requirementname, 'arrs', 'DCM', 'gi'); + END IF; + + IF EXISTS (SELECT 1 FROM ehr_compliancedb.EmployeeCategory WHERE categoryname ILIKE '%arrs%') THEN + UPDATE ehr_compliancedb.EmployeeCategory SET categoryname = regexp_replace(categoryname, 'arrs', 'DCM', 'gi'); + END IF; + + RETURN 0; + +EXCEPTION + WHEN OTHERS THEN + RETURN 1; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION onprc_ehr_compliancedb.p_ComplianceRecentOverDueSoon_Process() +RETURNS integer AS $$ +BEGIN + DELETE FROM onprc_ehr_compliancedb.ComplianceRecentReport; + + INSERT INTO onprc_ehr_compliancedb.ComplianceRecentReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + ) + SELECT + b.requirementname, + a.employeeid, + string_agg(a.unit, chr(10)) AS unit, + string_agg(a.category, chr(10)) AS category, + string_agg(b.trackingflag, chr(10)) AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT h.type FROM ehr_compliancedb.Requirements h WHERE h.requirementname = b.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) AS times_Completed, + (SELECT k.expireperiod FROM ehr_compliancedb.Requirements k WHERE k.requirementname = b.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) AS mostrecentcompleted_date, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = b.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = b.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = b.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = b.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.employeeperunit a, ehr_compliancedb.requirementspercategory b + WHERE (a.unit = b.unit OR a.category = b.category) + AND b.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE a.employeeid = t.employeeid AND b.requirementname = t.requirementname) + AND a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND b.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = b.requirementname AND q.dateDisabled IS NULL) + GROUP BY b.requirementname, a.employeeid + + UNION + + SELECT + a.requirementname, + a.employeeid, + NULL AS unit, + NULL AS category, + 'None' AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT h.type FROM ehr_compliancedb.Requirements h WHERE h.requirementname = a.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS timesCompleted, + (SELECT k.expireperiod FROM ehr_compliancedb.Requirements k WHERE k.requirementname = a.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS MostRecentDate, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = a.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = a.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.completiondates a + WHERE a.requirementname NOT IN ( + SELECT DISTINCT h.requirementname + FROM ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h + WHERE (k.unit = h.unit OR k.category = h.category) AND a.employeeid = k.employeeid + ) + AND a.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE a.employeeid = t.employeeid AND a.requirementname = t.requirementname) + AND a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND a.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = a.requirementname AND q.dateDisabled IS NULL) + GROUP BY a.requirementname, a.employeeid + + UNION + + SELECT + a.requirementname, + a.employeeid, + NULL AS unit, + NULL AS category, + 'No' AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT h.type FROM ehr_compliancedb.Requirements h WHERE h.requirementname = a.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS timesCompleted, + (SELECT k.expireperiod FROM ehr_compliancedb.Requirements k WHERE k.requirementname = a.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS MostRecentDate, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = a.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = a.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DECIMAL + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.employeerequirementexemptions a + WHERE a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND a.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = a.requirementname AND q.dateDisabled IS NULL) + GROUP BY a.requirementname, a.employeeid + + UNION + + SELECT + j.requirementname, + j.employeeid, + NULL AS unit, + NULL AS category, + string_agg(j.trackingflag, chr(10)) AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS trainee_type, + (SELECT h.type FROM ehr_compliancedb.Requirements h WHERE h.requirementname = j.requirementname) AS requirement_type, + 0 AS timesCompleted, + (SELECT k.expireperiod FROM ehr_compliancedb.Requirements k WHERE k.requirementname = j.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + NULL AS MostRecentDate, + '' AS comment, + NULL AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = j.requirementname AND st.employeeid = j.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = j.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM onprc_ehr_compliancedb.RequirementsPerEmployee j + WHERE j.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE j.employeeid = p.employeeid AND p.enddate IS NULL) + AND j.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = j.requirementname AND q.dateDisabled IS NULL) + AND j.requirementname NOT IN ( + SELECT DISTINCT h.requirementname + FROM ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h + WHERE (k.unit = h.unit OR k.category = h.category) AND j.employeeid = k.employeeid + ) + AND j.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE j.employeeid = t.employeeid AND j.requirementname = t.requirementname) + AND j.requirementname NOT IN (SELECT DISTINCT k.requirementname FROM ehr_compliancedb.completiondates k WHERE k.employeeid = j.employeeid) + GROUP BY j.requirementname, j.employeeid + ORDER BY employeeid, requirementname, mostrecentcompleted_date DESC; + + RETURN 0; + +EXCEPTION + WHEN OTHERS THEN + RETURN 1; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION onprc_ehr_compliancedb.p_ComplianceProcedureOverDueSoon_Process() +RETURNS integer AS $$ +BEGIN + DELETE FROM onprc_ehr_compliancedb.ComplianceProcedureReport; + + INSERT INTO onprc_ehr_compliancedb.ComplianceProcedureReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + ) + SELECT + b.requirementname, + a.employeeid, + string_agg(a.unit, chr(10)) AS unit, + string_agg(a.category, chr(10)) AS category, + string_agg(b.trackingflag, chr(10)) AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT h.type FROM ehr_compliancedb.Requirements h WHERE h.requirementname = b.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) AS times_Completed, + (SELECT k.expireperiod FROM ehr_compliancedb.Requirements k WHERE k.requirementname = b.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) AS mostrecentcompleted_date, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = b.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = b.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = b.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = b.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.employeeperunit a, ehr_compliancedb.requirementspercategory b + WHERE (a.unit = b.unit OR a.category = b.category) + AND b.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE a.employeeid = t.employeeid AND b.requirementname = t.requirementname) + AND a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND b.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = b.requirementname AND q.dateDisabled IS NULL) + GROUP BY b.requirementname, a.employeeid + + UNION + + SELECT + a.requirementname, + a.employeeid, + NULL AS unit, + NULL AS category, + 'None' AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT h.type FROM ehr_compliancedb.Requirements h WHERE h.requirementname = a.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS timesCompleted, + (SELECT k.expireperiod FROM ehr_compliancedb.Requirements k WHERE k.requirementname = a.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS MostRecentDate, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = a.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = a.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.completiondates a + WHERE a.requirementname NOT IN ( + SELECT DISTINCT h.requirementname + FROM ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h + WHERE (k.unit = h.unit OR k.category = h.category) AND a.employeeid = k.employeeid + ) + AND a.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE a.employeeid = t.employeeid AND a.requirementname = t.requirementname) + AND a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND a.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = a.requirementname AND q.dateDisabled IS NULL) + GROUP BY a.requirementname, a.employeeid + + UNION + + SELECT + a.requirementname, + a.employeeid, + NULL AS unit, + NULL AS category, + 'No' AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT h.type FROM ehr_compliancedb.Requirements h WHERE h.requirementname = a.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS timesCompleted, + (SELECT k.expireperiod FROM ehr_compliancedb.Requirements k WHERE k.requirementname = a.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS MostRecentDate, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = a.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = a.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DECIMAL + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.employeerequirementexemptions a + WHERE a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND a.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = a.requirementname AND q.dateDisabled IS NULL) + GROUP BY a.requirementname, a.employeeid + + UNION + + SELECT + j.requirementname, + j.employeeid, + NULL AS unit, + NULL AS category, + string_agg(j.trackingflag, chr(10)) AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS trainee_type, + (SELECT h.type FROM ehr_compliancedb.Requirements h WHERE h.requirementname = j.requirementname) AS requirement_type, + 0 AS timesCompleted, + (SELECT k.expireperiod FROM ehr_compliancedb.Requirements k WHERE k.requirementname = j.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + NULL AS MostRecentDate, + '' AS comment, + NULL AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = j.requirementname AND st.employeeid = j.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = j.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM onprc_ehr_compliancedb.RequirementsPerEmployee j + WHERE j.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE j.employeeid = p.employeeid AND p.enddate IS NULL) + AND j.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = j.requirementname AND q.dateDisabled IS NULL) + AND j.requirementname NOT IN ( + SELECT DISTINCT h.requirementname + FROM ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h + WHERE (k.unit = h.unit OR k.category = h.category) AND j.employeeid = k.employeeid + ) + AND j.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE j.employeeid = t.employeeid AND j.requirementname = t.requirementname) + AND j.requirementname NOT IN (SELECT DISTINCT k.requirementname FROM ehr_compliancedb.completiondates k WHERE k.employeeid = j.employeeid) + GROUP BY j.requirementname, j.employeeid + ORDER BY employeeid, requirementname, mostrecentcompleted_date DESC; + + RETURN 0; + +EXCEPTION + WHEN OTHERS THEN + RETURN 1; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION onprc_ehr_compliancedb.p_ComplianceAccesscontainerUpdate() +RETURNS integer AS $$ +BEGIN + IF EXISTS (SELECT 1 FROM ehr_compliancedb.completiondates WHERE container = 'f1c05e2d-618d-103d-abc9-9814909bffcd') THEN + UPDATE ehr_compliancedb.completiondates + SET container = 'cd170458-c55f-102f-9907-5107380a54be' + WHERE container = 'f1c05e2d-618d-103d-abc9-9814909bffcd'; + END IF; + + RETURN 0; + +EXCEPTION + WHEN OTHERS THEN + RETURN 1; +END; +$$ LANGUAGE plpgsql; diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/postgresql/onprc_ehr_compliancedb-25.000-25.001.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/postgresql/onprc_ehr_compliancedb-25.000-25.001.sql new file mode 100644 index 000000000..a044debfc --- /dev/null +++ b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/postgresql/onprc_ehr_compliancedb-25.000-25.001.sql @@ -0,0 +1,609 @@ +ALTER TABLE onprc_ehr_compliancedb.ComplianceProcedureReport ALTER COLUMN expired_period TYPE VARCHAR(50); +ALTER TABLE onprc_ehr_compliancedb.ComplianceProcedureReport ALTER COLUMN new_expired_period TYPE VARCHAR(50); + +ALTER TABLE onprc_ehr_compliancedb.ComplianceRecentReport ALTER COLUMN expired_period TYPE VARCHAR(50); +ALTER TABLE onprc_ehr_compliancedb.ComplianceRecentReport ALTER COLUMN new_expired_period TYPE VARCHAR(50); + +-- Author: R. Blasa +-- Created: 9-20-2024 +/* +** +** Created by +** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from +** the ComplianceProcedureRecentTest.sql query +** +** 1-22-2026 Fix the issues with more than one subquery results +** +*/ + +CREATE OR REPLACE FUNCTION onprc_ehr_compliancedb.p_ComplianceProcedureOverDueSoon_Process() +RETURNS integer AS $$ +BEGIN + -- Reset Reporting table + DELETE FROM onprc_ehr_compliancedb.ComplianceProcedureReport; + + INSERT INTO onprc_ehr_compliancedb.ComplianceProcedureReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + ) + SELECT + b.requirementname, + a.employeeid, + string_agg(a.unit, chr(10)) AS unit, + string_agg(a.category, chr(10)) AS category, + string_agg(b.trackingflag, chr(10)) AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT string_agg(h.type::text, chr(10)) FROM ehr_compliancedb.Requirements h WHERE h.requirementname = b.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) AS times_Completed, + (SELECT string_agg(k.expireperiod::text, chr(10)) FROM ehr_compliancedb.Requirements k WHERE k.requirementname = b.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) AS mostrecentcompleted_date, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = b.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = b.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = b.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = b.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.employeeperunit a, ehr_compliancedb.requirementspercategory b + WHERE (a.unit = b.unit OR a.category = b.category) + AND b.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE a.employeeid = t.employeeid AND b.requirementname = t.requirementname) + AND a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND b.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = b.requirementname AND q.dateDisabled IS NULL) + GROUP BY b.requirementname, a.employeeid + + UNION + + SELECT + a.requirementname, + a.employeeid, + NULL AS unit, + NULL AS category, + 'None' AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT string_agg(h.type::text, chr(10)) FROM ehr_compliancedb.Requirements h WHERE h.requirementname = a.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS timesCompleted, + (SELECT string_agg(k.expireperiod::text, chr(10)) FROM ehr_compliancedb.Requirements k WHERE k.requirementname = a.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS MostRecentDate, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = a.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = a.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.completiondates a + WHERE a.requirementname NOT IN ( + SELECT DISTINCT h.requirementname + FROM ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h + WHERE (k.unit = h.unit OR k.category = h.category) AND a.employeeid = k.employeeid + ) + AND a.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE a.employeeid = t.employeeid AND a.requirementname = t.requirementname) + AND a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND a.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = a.requirementname AND q.dateDisabled IS NULL) + GROUP BY a.requirementname, a.employeeid + + -- Additional requirements for employees that have not completed training, but is required + UNION + + SELECT + j.requirementname, + j.employeeid, + NULL AS unit, + NULL AS category, + string_agg(j.trackingflag, chr(10)) AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS trainee_type, + (SELECT string_agg(h.type::text, chr(10)) FROM ehr_compliancedb.Requirements h WHERE h.requirementname = j.requirementname) AS requirement_type, + 0 AS timesCompleted, + (SELECT string_agg(k.expireperiod::text, chr(10)) FROM ehr_compliancedb.Requirements k WHERE k.requirementname = j.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + NULL AS MostRecentDate, + '' AS comment, + NULL AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = j.requirementname AND st.employeeid = j.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = j.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM onprc_ehr_compliancedb.RequirementsPerEmployee j + WHERE j.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE j.employeeid = p.employeeid AND p.enddate IS NULL) + AND j.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = j.requirementname AND q.dateDisabled IS NULL) + AND j.requirementname NOT IN ( + SELECT DISTINCT h.requirementname + FROM ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h + WHERE (k.unit = h.unit OR k.category = h.category) AND j.employeeid = k.employeeid + ) + AND j.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE j.employeeid = t.employeeid AND j.requirementname = t.requirementname) + AND j.requirementname NOT IN (SELECT DISTINCT k.requirementname FROM ehr_compliancedb.completiondates k WHERE k.employeeid = j.employeeid) + GROUP BY j.requirementname, j.employeeid + ORDER BY employeeid, requirementname, mostrecentcompleted_date DESC; + + RETURN 0; + +EXCEPTION + WHEN OTHERS THEN + RETURN 1; +END; +$$ LANGUAGE plpgsql; + +-- Author: R. Blasa +-- Created: 9-20-2024 +/* +** +** Created by +** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from +** the ComplianceRecentTest.sql query +** +** 1-22-2026 Fix the issues with more than one subquery results +** +*/ + +CREATE OR REPLACE FUNCTION onprc_ehr_compliancedb.p_ComplianceRecentOverDueSoon_Process() +RETURNS integer AS $$ +BEGIN + -- Reset Reporting table + DELETE FROM onprc_ehr_compliancedb.ComplianceRecentReport; + + INSERT INTO onprc_ehr_compliancedb.ComplianceRecentReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + ) + SELECT + b.requirementname, + a.employeeid, + string_agg(a.unit, chr(10)) AS unit, + string_agg(a.category, chr(10)) AS category, + string_agg(b.trackingflag, chr(10)) AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT string_agg(h.type::text, chr(10)) FROM ehr_compliancedb.Requirements h WHERE h.requirementname = b.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) AS times_Completed, + (SELECT string_agg(k.expireperiod::text, chr(10)) FROM ehr_compliancedb.Requirements k WHERE k.requirementname = b.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) AS mostrecentcompleted_date, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = b.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = b.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = b.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = b.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = b.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = b.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.employeeperunit a, ehr_compliancedb.requirementspercategory b + WHERE (a.unit = b.unit OR a.category = b.category) + AND b.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE a.employeeid = t.employeeid AND b.requirementname = t.requirementname) + AND a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND b.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = b.requirementname AND q.dateDisabled IS NULL) + GROUP BY b.requirementname, a.employeeid + + UNION + + SELECT + a.requirementname, + a.employeeid, + NULL AS unit, + NULL AS category, + 'None' AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT string_agg(h.type::text, chr(10)) FROM ehr_compliancedb.Requirements h WHERE h.requirementname = a.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS timesCompleted, + (SELECT string_agg(k.expireperiod::text, chr(10)) FROM ehr_compliancedb.Requirements k WHERE k.requirementname = a.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS MostRecentDate, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = a.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = a.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.completiondates a + WHERE a.requirementname NOT IN ( + SELECT DISTINCT h.requirementname + FROM ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h + WHERE (k.unit = h.unit OR k.category = h.category) AND a.employeeid = k.employeeid + ) + AND a.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE a.employeeid = t.employeeid AND a.requirementname = t.requirementname) + AND a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND a.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = a.requirementname AND q.dateDisabled IS NULL) + GROUP BY a.requirementname, a.employeeid + + -- Training that was completed by as an employee training exemptions, and at least completed one, or more times + UNION + + SELECT + a.requirementname, + a.employeeid, + NULL AS unit, + NULL AS category, + 'No' AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = a.employeeid) AS trainee_type, + (SELECT string_agg(h.type::text, chr(10)) FROM ehr_compliancedb.Requirements h WHERE h.requirementname = a.requirementname) AS requirement_type, + (SELECT count(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS timesCompleted, + (SELECT string_agg(k.expireperiod::text, chr(10)) FROM ehr_compliancedb.Requirements k WHERE k.requirementname = a.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) AS MostRecentDate, + ( + SELECT string_agg(DISTINCT yy.comment, chr(10)) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS comment, + ( + SELECT max(yy.snooze_date) + FROM ehr_compliancedb.completiondates yy + WHERE yy.date IN (SELECT max(zz.date) FROM ehr_compliancedb.completiondates zz WHERE zz.requirementname = a.requirementname AND zz.employeeid = a.employeeid) + AND yy.requirementname = a.requirementname AND yy.employeeid = a.employeeid + ) AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = a.requirementname AND st.employeeid = a.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = a.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = a.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = a.employeeid + GROUP BY tt.expireperiod + ) + END AS DECIMAL + ) AS MonthsUntilRenewal + FROM ehr_compliancedb.employeerequirementexemptions a + WHERE a.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE a.employeeid = p.employeeid AND p.enddate IS NULL) + AND a.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = a.requirementname AND q.dateDisabled IS NULL) + GROUP BY a.requirementname, a.employeeid + + -- Additional requirements for employees that have not completed training, but is required + UNION + + SELECT + j.requirementname, + j.employeeid, + NULL AS unit, + NULL AS category, + string_agg(j.trackingflag, chr(10)) AS trackingflag, + (SELECT h.email FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS email, + (SELECT h.lastname FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS lastname, + (SELECT h.firstname FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS firstname, + (SELECT h.majorudds FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS host, + (SELECT h.supervisor FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS supervisor, + (SELECT h.type FROM ehr_compliancedb.employees h WHERE h.employeeid = j.employeeid) AS trainee_type, + (SELECT string_agg(h.type::text, chr(10)) FROM ehr_compliancedb.Requirements h WHERE h.requirementname = j.requirementname) AS requirement_type, + 0 AS timesCompleted, + (SELECT string_agg(k.expireperiod::text, chr(10)) FROM ehr_compliancedb.Requirements k WHERE k.requirementname = j.requirementname) AS ExpiredPeriod, + ( + SELECT ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING (COALESCE(tt.expireperiod, 0)) > ((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + AND (tt.reviewdate IS NOT NULL) + ) AS NewExpirePeriod, + NULL AS MostRecentDate, + '' AS comment, + NULL AS snooze_date, + CAST( + CASE + WHEN (SELECT max(st.date) FROM ehr_compliancedb.completiondates st WHERE st.requirementname = j.requirementname AND st.employeeid = j.employeeid) IS NULL THEN 0 + WHEN (SELECT COALESCE(tt.expireperiod, 0) FROM ehr_compliancedb.requirements tt WHERE tt.requirementname = j.requirementname GROUP BY tt.expireperiod) = 0 THEN NULL + WHEN ( + SELECT count(*) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) > 0 THEN + ( + SELECT (((EXTRACT(YEAR FROM tt.reviewdate) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM tt.reviewdate) - EXTRACT(MONTH FROM max(pq.date))) + - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date)))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod, tt.reviewdate + HAVING tt.reviewdate > max(pq.date) + ) + ELSE + ( + SELECT COALESCE(tt.expireperiod, 0) - ((EXTRACT(YEAR FROM now()) - EXTRACT(YEAR FROM max(pq.date))) * 12 + EXTRACT(MONTH FROM now()) - EXTRACT(MONTH FROM max(pq.date))) + FROM ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq + WHERE tt.requirementname = j.requirementname AND pq.requirementname = tt.requirementname AND pq.employeeid = j.employeeid + GROUP BY tt.expireperiod + ) + END AS DOUBLE PRECISION + ) AS MonthsUntilRenewal + FROM onprc_ehr_compliancedb.RequirementsPerEmployee j + WHERE j.employeeid IN (SELECT p.employeeid FROM ehr_compliancedb.employees p WHERE j.employeeid = p.employeeid AND p.enddate IS NULL) + AND j.requirementname IN (SELECT q.requirementname FROM ehr_compliancedb.Requirements q WHERE q.requirementname = j.requirementname AND q.dateDisabled IS NULL) + AND j.requirementname NOT IN ( + SELECT DISTINCT h.requirementname + FROM ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h + WHERE (k.unit = h.unit OR k.category = h.category) AND j.employeeid = k.employeeid + ) + AND j.requirementname NOT IN (SELECT DISTINCT t.requirementname FROM ehr_compliancedb.employeerequirementexemptions t WHERE j.employeeid = t.employeeid AND j.requirementname = t.requirementname) + AND j.requirementname NOT IN (SELECT DISTINCT k.requirementname FROM ehr_compliancedb.completiondates k WHERE k.employeeid = j.employeeid) + GROUP BY j.requirementname, j.employeeid + ORDER BY employeeid, requirementname, mostrecentcompleted_date DESC; + + RETURN 0; + +EXCEPTION + WHEN OTHERS THEN + RETURN 1; +END; +$$ LANGUAGE plpgsql; diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-0.000-24.000.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-0.000-24.000.sql deleted file mode 100644 index 53b469216..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-0.000-24.000.sql +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2024-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - -CREATE SCHEMA onprc_ehr_compliancedb; -GO - -CREATE TABLE onprc_ehr_compliancedb.SciShield_Data -( - RowId INT IDENTITY(1,1) NOT NULL, - employeeId nvarchar(255) not null, - requirementname nvarchar(255) null, - Date datetime null, - Container ENTITYID NOT NULL, - comment nvarchar(2000) null, - CreatedBy USERID, - Created datetime, - ModifiedBy USERID, - Modified datetime, - processed int NULL - - CONSTRAINT PK_ScieShield_Data PRIMARY KEY (RowId), - CONSTRAINT FK_ONPRC_EHR_COMPLIANCE_SCISHIELD_DATA_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) -); -CREATE INDEX IX_ONPRC_EHR_COMPLIANCEDB_SCISHIELD_DATA_CONTAINER ON onprc_ehr_compliancedb.SciShield_Data (Container); - -CREATE TABLE onprc_ehr_compliancedb.SciShield_Reference_Data -( - rowId int identity(1,1), - label nvarchar(250) NULL, - value nvarchar(255) NOT NULL , - columnName nvarchar(255) NOT NULL, - sort_order integer null, - endDate datetime NULL, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created datetime, - ModifiedBy USERID, - Modified datetime, - - CONSTRAINT pk_SciShield_reference PRIMARY KEY (value), - CONSTRAINT FK_ONPRC_EHR_COMPLIANCE_REFERENCE_DATA_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) -); -CREATE INDEX IX_ONPRC_EHR_COMPLIANCEDB_SCISHIELD_REFERENCE_DATA_CONTAINER ON onprc_ehr_compliancedb.SciShield_Reference_Data (Container); - -GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-0.000-25.000.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-0.000-25.000.sql new file mode 100644 index 000000000..a2339f639 --- /dev/null +++ b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-0.000-25.000.sql @@ -0,0 +1,2530 @@ +CREATE SCHEMA onprc_ehr_compliancedb; +GO + +CREATE TABLE onprc_ehr_compliancedb.SciShield_Data +( + RowId INT IDENTITY(1,1) NOT NULL, + employeeId nvarchar(255) not null, + requirementname nvarchar(255) null, + Date datetime null, + Container ENTITYID NOT NULL, + comment nvarchar(2000) null, + CreatedBy USERID, + Created datetime, + ModifiedBy USERID, + Modified datetime, + processed int NULL + + CONSTRAINT PK_ScieShield_Data PRIMARY KEY (RowId), + CONSTRAINT FK_ONPRC_EHR_COMPLIANCE_SCISHIELD_DATA_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) +); +CREATE INDEX IX_ONPRC_EHR_COMPLIANCEDB_SCISHIELD_DATA_CONTAINER ON onprc_ehr_compliancedb.SciShield_Data (Container); + +CREATE TABLE onprc_ehr_compliancedb.SciShield_Reference_Data +( + rowId int identity(1,1), + label nvarchar(250) NULL, + value nvarchar(255) NOT NULL , + columnName nvarchar(255) NOT NULL, + sort_order integer null, + endDate datetime NULL, + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created datetime, + ModifiedBy USERID, + Modified datetime, + + CONSTRAINT pk_SciShield_reference PRIMARY KEY (value), + CONSTRAINT FK_ONPRC_EHR_COMPLIANCE_REFERENCE_DATA_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) +); +CREATE INDEX IX_ONPRC_EHR_COMPLIANCEDB_SCISHIELD_REFERENCE_DATA_CONTAINER ON onprc_ehr_compliancedb.SciShield_Reference_Data (Container); + +GO + +/* 24.xxx SQL scripts */ + +-- Author: R. Blasa +-- Created: 2-10-2024 +-- Description: Stored procedure program process SciShield INitial Data + + +CREATE TABLE [onprc_ehr_compliancedb].[SciShieldTemp] ( + [searchID] [int] IDENTITY(100,1) NOT NULL, + [employeeid] [varchar](500) NULL, + [requirementname] [varchar](3000) NULL, + [completeddate] [smalldatetime] NULL, + [comment] [varchar](300) NULL, + [createddate] [smalldatetime] NULL, + [rowid] [int] NULL + ) ON [PRIMARY] + GO + +CREATE TABLE [onprc_ehr_compliancedb].[SciShieldMasterTemp]( + [searchID] [int] IDENTITY(100,1) NOT NULL, + [employeeid] [varchar](500) NULL, + [requirementname] [varchar](3000) NULL, + [completeddate] [smalldatetime] NULL, + [comment] [varchar](300) NULL, + [createddate] [smalldatetime] NULL, + [rowid] [int] NULL + ) ON [PRIMARY] + GO + + + +-- Author: R. Blasa +-- Created: 2-10-2024 + +/* +** +** Created by +** Blasa 1-25-2024 Import process from ScieShield To Prime Compliance Module +** +** Processed codes: Null ---Not Processed +** 1 ------ Successfully posted +** 2 --------- invalid Employeeid +** 3 --------- Undefined Requirement Name +** 4--------- Already exists Compliance module +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.[p_SciShieldToPrimeProcess] + + +AS + + +DECLARE + @SearchKey Int, + @TempsearchKey Int, + @requirementnameFinal varchar(2000), + @requirementnanme varchar(2000), + @employeeid varchar(500), + @Completiondate smalldatetime, + @SciShieldID int + + + + + +BEGIN + + ---- Reset temp table + + Delete onprc_ehr_compliancedb.SciShieldTemp + + + If @@Error <> 0 + GoTo Err_Proc + + +If exists(Select * from onprc_ehr_compliancedb.SciShield_Data where processed is null) +BEGIN + + Insert into onprc_ehr_compliancedb.SciShieldTemp + ( + employeeid, + requirementname, + completeddate, + createddate, + rowid + ) + + + select + employeeid, -------employeeid + requirementname, ----requirement name + date, ----completed Date + getdate(), --- created date + rowid --- SciShield unique id + + + from onprc_ehr_compliancedb.SciShield_Data + where processed is null + + order by employeeid, requirementname, date desc + + If @@Error <> 0 + GoTo Err_Proc + + END + +ELSE ------ No new entries exit + BEGIN + + GOTO No_Records + + END + + --- Initialize Varaibles + + Set @TempsearchKey = 0 + Set @SearchKey = 0 + + + + --- Start processing input records from SciShield + + + Select top 1 @searchkey = searchID from onprc_ehr_compliancedb.SciShieldTemp + order by searchID + + + + +While @TempSearchKey < @SearchKey + BEGIN + Set @requirementnameFinal = '' + Set @requirementnanme = '' + Set @employeeid = '' + Set @Completiondate = Null + Set @SciShieldID = Null + + + Select @employeeid =rtrim(ltrim(lower(employeeid))), @requirementnanme = requirementname, @completiondate = completeddate, @SciShieldID = rowid + from onprc_ehr_compliancedb.SciShieldTemp Where searchID = @Searchkey + + ---Validate requirementname + IF exists (Select * from onprc_ehr_compliancedb.SciShield_Reference_Data where label = @requirementnanme And columnname = 'requirementname' ) + BEGIN + + Select @requirementnameFinal = value from onprc_ehr_compliancedb.SciShield_Reference_Data where label = @requirementnanme And columnname = 'requirementname' + END + ELSE IF exists (Select * from ehr_compliancedb.requirements where requirementname = @requirementnanme) + BEGIN + Select @requirementnameFinal = requirementname from ehr_compliancedb.requirements where requirementname = @requirementnanme + END + + ELSE + BEGIN + Update ss + Set ss.processed = 3 + + From onprc_ehr_compliancedb.SciShield_Data ss Where ss.rowid = @SciShieldID + + If @@Error <> 0 + GoTo Err_Proc + + GOTO Next_Record + END + + ----validate if the record already exists + + IF exists( Select * from ehr_compliancedb.completiondates Where employeeid = @employeeid And requirementname = @requirementnameFinal + And date = @completiondate) + BEGIN + Update ss + Set ss.processed = 4 + + From onprc_ehr_compliancedb.SciShield_Data ss Where ss.rowid = @SciShieldID + + If @@Error <> 0 + GoTo Err_Proc + + GOTO Next_Record + END + + + ----validate if the employeeid is defined + + IF not exists( Select * from ehr_compliancedb.employees Where employeeid = @employeeid And enddate is null) + BEGIN + + Update ss + Set ss.processed = 2 + + From onprc_ehr_compliancedb.SciShield_Data ss Where ss.rowid = @SciShieldID + + + If @@Error <> 0 + GoTo Err_Proc + + GOTO Next_Record + + + + END ---- + + + ---- IF all previous version were validated proceed with the record insert + + + IF not exists( Select * from ehr_compliancedb.completiondates Where employeeid = @employeeid And requirementname = @requirementnameFinal + And date = @completiondate) + + BEGIN + Insert into ehr_compliancedb.completiondates + (employeeid, + requirementname, + date, + trainer, + container, + created, + createdby, + modified, + modifiedby + + ) + values( + @employeeid, + @requirementnameFinal, + @completiondate, + 'ONLINE TRAINING', + 'CD170458-C55F-102F-9907-5107380A54BE', + getdate(), + 2595, + getdate(), + 2595 + ) + If @@Error <> 0 + GoTo Err_Proc + + + + +---------- Set successful entry flag + + Update ss + Set ss.processed = 1 + + From onprc_ehr_compliancedb.SciShield_Data ss Where ss.rowid = @SciShieldID + + + If @@Error <> 0 + GoTo Err_Proc + +END ---- + + + + +Next_Record: + + + + Set @TempSearchkey = @SearchKey + + + Select Top 1 @Searchkey = searchID from onprc_ehr_compliancedb.SciShieldTemp + Where searchID > @TempSearchkey + Order by searchID + + + +END ---(While) + + + + ---- Create a master records of the last most recent entries + If exists (Select * from onprc_ehr_compliancedb.SciShieldTemp) + BEGiN + Insert into onprc_ehr_compliancedb.SciShieldMasterTemp + select + employeeid, + requirementname, + completeddate, + comment, + createddate, + rowid + + + from onprc_ehr_compliancedb.SciShieldTemp + + + If @@Error <> 0 + GoTo Err_Proc +END + +No_Records: + + RETURN 0 + + +Err_Proc: + -------Error Generated, Transfer process stopped + RETURN 1 + + +END + +GO + +CREATE INDEX IX_completiondates_trainer ON ehr_compliancedb.completiondates(trainer); +GO + +-- Author: R. Blasa +-- Created: 9-16-2024 + +/* +** +** Created by +** Blasa 9-16-2024 Storedprocedure to update Compliance Access contaimer values +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.[p_ComplianceAccesscontainerUpdate] + + +AS + + + +BEGIN + + ------ Update container value and include as part of the main Compliance module + +If exists(Select * from ehr_Compliancedb.CompletionDates ss where ss.container = '47F00C3F-5691-103D-8866-41AD310B2640' ) +BEGIN + + Update ss + set ss.container = 'CD170458-C55F-102F-9907-5107380A54BE' ----Compliance folder on Prime Production + + from ehr_Compliancedb.CompletionDates ss + Where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ---Compliance Access folder on Prime Production + + If @@Error <> 0 + GoTo Err_Proc + + END + +ELSE ------ No new entries exit + BEGIN + + GOTO No_Records + + END + + + + +No_Records: + + RETURN 0 + + +Err_Proc: + -------Error Generated, Transfer process stopped + RETURN 1 + + +END + +GO + +EXEC core.fn_dropifexists 'p_ComplianceAccesscontainerUpdate', 'onprc_ehr_compliancedb', 'PROCEDURE'; +GO + +-- Author: R. Blasa +-- Created: 10-2-2024 + +/* +** +** Created by +** Blasa 9-16-2024 Storedprocedure to update Compliance Access contaimer values. +** 10-2-2024 Corrected Container values. +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.p_ComplianceAccesscontainerUpdate + + +AS + + + +BEGIN + + ------ Update container value and include as part of the main Compliance module + +If exists(Select * from ehr_Compliancedb.CompletionDates ss where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ) +BEGIN + + Update ss + set ss.container = 'CD170458-C55F-102F-9907-5107380A54BE' ----Compliance folder on Prime Production + + from ehr_Compliancedb.CompletionDates ss + Where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ---Compliance Access folder on Prime Production + + If @@Error <> 0 + GoTo Err_Proc + + END + +ELSE ------ No new entries exit + BEGIN + + GOTO No_Records + + END + + + + +No_Records: + + RETURN 0 + + +Err_Proc: + -------Error Generated, Transfer process stopped + RETURN 1 + + +END + +GO + +EXEC core.fn_dropifexists 'p_ComplianceAccesscontainerUpdate', 'onprc_ehr_compliancedb', 'PROCEDURE'; +GO + +-- Author: R. Blasa +-- Created: 12-10-2024 + +/* +** +** Created by +** Blasa 12-10-2024 Storedprocedure to update string name "ARRS" to "DCM" +** +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.p_ComplianceTranslatestringUpdate + + +AS + + + +BEGIN + + ------ Update container value and include as part of the main Compliance module + +If exists(select * from ehr_compliancedb.EmployeePerUnit ------> count= 496 + where unit like '%arrs%' + ) +BEGIN + + Update ehr_compliancedb.EmployeePerUnit + set unit = replace(unit,'arrs', 'DCM') + + + + If @@Error <> 0 + GoTo Err_Proc + + END + + + If exists(select * from ehr_compliancedb.EmployeePerUnit ------> count= 496 + where category like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.EmployeePerUnit + set category = replace(category,'arrs', 'DCM') + + + + If @@Error <> 0 + GoTo Err_Proc + + END + + + + If exists(select * from ehr_compliancedb.Employees + where majorudds like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.Employees + set majorudds = replace(majorudds,'arrs', 'DCM') + + + + If @@Error <> 0 + GoTo Err_Proc + + END + + + + If exists(select * from ehr_compliancedb.Employees + where unit like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.Employees + set unit = replace(unit,'arrs', 'DCM') + + If @@Error <> 0 + GoTo Err_Proc + + END + + + + If exists(select * from ehr_compliancedb.Employees + where category like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.Employees + set category = replace(category,'arrs', 'DCM') + + If @@Error <> 0 + GoTo Err_Proc + + END + + + + If exists(select * from ehr_compliancedb.requirements + where requirementname like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.requirements + set requirementname = replace(requirementname,'arrs', 'DCM') + + + If @@Error <> 0 + GoTo Err_Proc + + END + + + + If exists(select * from ehr_compliancedb.EmployeeRequirementExemptions + where requirementname like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.EmployeeRequirementExemptions + set requirementname = replace(requirementname,'arrs', 'DCM') + + + If @@Error <> 0 + GoTo Err_Proc + + END + + + + + If exists(select * from ehr_compliancedb.unit_names + where unit like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.unit_names + set unit = replace(unit,'arrs', 'DCM') + + + + If @@Error <> 0 + GoTo Err_Proc + + END + + + If exists(select * from ehr_compliancedb.RequirementsPerCategory + where RequirementName like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.RequirementsPerCategory + set requirementname = replace(requirementname,'arrs', 'DCM') + + + + If @@Error <> 0 + GoTo Err_Proc + + END + + + If exists(select * from ehr_compliancedb.RequirementsPerCategory + where category like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.RequirementsPerCategory + set category = replace(category,'arrs', 'DCM') + + If @@Error <> 0 + GoTo Err_Proc + + END + + + If exists(select * from ehr_compliancedb.RequirementsPerCategory + where unit like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.RequirementsPerCategory + set unit = replace(unit,'arrs', 'DCM') + + + If @@Error <> 0 + GoTo Err_Proc + + END + + If exists(select * from ehr_compliancedb.completiondates + where requirementname like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.completiondates + set requirementname = replace(requirementname,'arrs', 'DCM') + + + If @@Error <> 0 + GoTo Err_Proc + + END + + If exists(select * from ehr_compliancedb.EmployeeCategory + where categoryname like '%arrs%' + ) + BEGIN + + Update ehr_compliancedb.EmployeeCategory + set categoryname = replace(categoryname ,'arrs', 'DCM') + + + If @@Error <> 0 + GoTo Err_Proc + + END + + + + + + + + +No_Records: + + RETURN 0 + + +Err_Proc: + -- + RETURN 1 + + +END + +GO + +-- Author: R. Blasa +-- Created: 9-20-2024-2024 +-- Description: Stored procedure program to create a static data set for Compliance Procedure Recent Test .sql + + + CREATE TABLE onprc_ehr_compliancedb.ComplianceProcedureReport( + [rowid] [int] IDENTITY(1,1) NOT NULL, + [employeeid] varchar(300) NULL, + [requirementname] [varchar](4000) NULL, + [unit] [varchar](500) NULL, + [category] [varchar](500) NULL, + [trackingflag] [varchar](100) NULL, + [email] [varchar](500) NULL, + [lastname] [varchar](500) NULL, + [firstname] [varchar](500) NULL, + [host] [varchar](500) NULL, + [supervisor] [varchar](500) NULL, + [trainee_type] [varchar](500) NULL, + [times_completed] [smallint] NULL, + [expired_period] [smallint] NULL, + [new_expired_period] [smallint] NULL, + [mostrecentcompleted_date] [smalldatetime] NULL, + [comment] [varchar](4000) NULL, + [snooze_date] [smalldatetime] NULL, + [months_until_renewal] [Float] NULL, + [requirement_name_type] [varchar](1000) NULL + + ) ON [PRIMARY] + GO + +-- Author: R. Blasa +-- Created: 9-20-2024 + +/* +** +** Created by +** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from +** the ComplianceProcedureRecentTest.sql query +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.p_ComplianceProcedureOverDueSoon_Process + + +AS + + + ----- Reset Reporting table + Delete onprc_ehr_compliancedb.ComplianceProcedureReport + + If @@Error <> 0 + GoTo Err_Proc + + + +BEGIN + + Insert into onprc_ehr_compliancedb.ComplianceProcedureReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + + ) + + + + + + select b.requirementname, + a.employeeid, + string_agg(a.unit,char(10)) as unit, + string_agg(a.category,char(10)) as category, + (select top 1 h.trackingflag from ehr_compliancedb.requirementspercategory h where h.requirementname = b.requirementname) as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate()) ) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) + + + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate()) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS Float) AS MonthsUntilRenewal + + + + from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b + where ( a.unit = b.unit or a.category = b.category ) + And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And b.requirementname = t.requirementname) + + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) + + + group by b.requirementname,a.employeeid + + + union + + select a.requirementname, + a.employeeid, + null as unit, + null as category, + 'No' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select ( datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate()) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS Float) AS MonthsUntilRenewal + + + from ehr_compliancedb.completiondates a + where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit + or k.category = h.category) And a.employeeid = k.employeeid ) + And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And a.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) + + group by a.requirementname,a.employeeid + + UNION + + -- Additional requirements for employees that have not completed training, but is required + select j.requirementname, + j.employeeid, + null as unit, + null as category, + 'Yes' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer + null as timesCompleted, + null as ExpiredPeriod, + null as NewExpirePeriod, + null as MostRecentDate, + '' as comment, + null as snooze_date, + null AS MonthsUntilRenewal + + + + from ehr_compliancedb.RequirementsPerEmployee j + Where j.requirementname not in (select z.requirementname from ehr_compliancedb.completiondates z where z.requirementname = j.requirementname + and z.employeeid = j.employeeid and z.date is not null) + And j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) + And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) + + group by j.requirementname,j.employeeid + + order by employeeid,requirementname, mostrecentcompleted_date desc + + + If @@Error <> 0 + GoTo Err_Proc + + + + + RETURN 0 + + +Err_Proc: + + RETURN 1 + + +END + +GO + +-- Author: R. Blasa +-- Created: 9-20-2024-2024 +-- Description: Stored procedure program to create a static data set for Compliance Recent Test .sql + + + CREATE TABLE onprc_ehr_compliancedb.ComplianceRecentReport( + [rowid] [int] IDENTITY(1,1) NOT NULL, + [employeeid] varchar(300) NULL, + [requirementname] [varchar](4000) NULL, + [unit] [varchar](500) NULL, + [category] [varchar](500) NULL, + [trackingflag] [varchar](100) NULL, + [email] [varchar](500) NULL, + [lastname] [varchar](500) NULL, + [firstname] [varchar](500) NULL, + [host] [varchar](500) NULL, + [supervisor] [varchar](500) NULL, + [trainee_type] [varchar](500) NULL, + [times_completed] [smallint] NULL, + [expired_period] [smallint] NULL, + [new_expired_period] [smallint] NULL, + [mostrecentcompleted_date] [smalldatetime] NULL, + [comment] [varchar](4000) NULL, + [snooze_date] [smalldatetime] NULL, + [months_until_renewal] [FLOAT] NULL, + [requirement_name_type] [varchar](1000) NULL + + ) ON [PRIMARY] + GO + + +-- Author: R. Blasa +-- Created: 9-20-2024 + +/* +** +** Created by +** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from +** the ComplianceRecentTest.sql query +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.p_ComplianceRecentOverDueSoon_Process + + +AS + + + + ----- Reset Reporting table + Delete onprc_ehr_compliancedb.ComplianceRecentReport + + If @@Error <> 0 + GoTo Err_Proc + + + +BEGIN + + Insert into onprc_ehr_compliancedb.ComplianceRecentReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + + ) + + + + + select b.requirementname, + a.employeeid, + string_agg(a.unit,char(10)) as unit, + string_agg(a.category,char(10)) as category, + (select top 1 h.trackingflag from ehr_compliancedb.requirementspercategory h where h.requirementname = b.requirementname) as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) + + + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + + from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b + where ( a.unit = b.unit or a.category = b.category ) + And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And b.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) + + + group by b.requirementname,a.employeeid + + + union + + select a.requirementname, + a.employeeid, + null as unit, + null as category, + 'No' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + from ehr_compliancedb.completiondates a + where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit + or k.category = h.category) And a.employeeid = k.employeeid ) + And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And a.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) + + group by a.requirementname,a.employeeid + + UNION + + --- Training that was completed by as an employee training exemptions, and at least completed one, or more times + + select a.requirementname, + a.employeeid, + null as unit, + null as category, + 'No' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) ) + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS DECIMAL) AS MonthsUntilRenewal + + + from ehr_compliancedb.employeerequirementexemptions a + Where a.requirementname in (select z.requirementname from ehr_compliancedb.completiondates z where z.requirementname = a.requirementname + and z.employeeid = a.employeeid and z.date is not null) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) + + group by a.requirementname,a.employeeid + + UNION + + --- Additional requirements for employees that have not completed training, but is required + + select j.requirementname, + j.employeeid, + null as unit, + null as category, + 'Yes' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = j.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) + And yy.requirementname= j.requirementname and yy.employeeid= j.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) + And yy.requirementname= j.requirementname and yy.employeeid= j.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = j.requirementname and st.employeeid = j.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = j.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) ) + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod ) + + END AS DECIMAL) AS MonthsUntilRenewal + + + + + + from ehr_compliancedb.RequirementsPerEmployee j + Where j.requirementname not in (select z.requirementname from ehr_compliancedb.completiondates z where z.requirementname = j.requirementname + and z.employeeid = j.employeeid and z.date is not null) + And j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) + And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) + + group by j.requirementname,j.employeeid + + order by employeeid,requirementname, mostrecentcompleted_date desc + + + If @@Error <> 0 + GoTo Err_Proc + + + + + RETURN 0 + + +Err_Proc: + + RETURN 1 + + +END + +GO + +EXEC core.fn_dropifexists 'p_ComplianceRecentOverDueSoon_Process', 'onprc_ehr_compliancedb', 'PROCEDURE'; +GO + +-- Author: R. Blasa +-- Created: 9-20-2024 + +/* +** +** Created by +** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from +** the ComplianceRecentTest.sql query +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.p_ComplianceRecentOverDueSoon_Process + + +AS + + + + ----- Reset Reporting table + Delete onprc_ehr_compliancedb.ComplianceRecentReport + + If @@Error <> 0 + GoTo Err_Proc + + + +BEGIN + + Insert into onprc_ehr_compliancedb.ComplianceRecentReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + + ) + + + + + select b.requirementname, + a.employeeid, + string_agg(a.unit,char(10)) as unit, + string_agg(a.category,char(10)) as category, + string_agg(b.trackingflag,char(10)) as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) + + + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + + from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b + where ( a.unit = b.unit or a.category = b.category ) + And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And b.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) + + + group by b.requirementname,a.employeeid + + + union + + select a.requirementname, + a.employeeid, + null as unit, + null as category, + 'None' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + from ehr_compliancedb.completiondates a + where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit + or k.category = h.category) And a.employeeid = k.employeeid ) + And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And a.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) + + group by a.requirementname,a.employeeid + + UNION + + --- Training that was completed by as an employee training exemptions, and at least completed one, or more times + + select a.requirementname, + a.employeeid, + null as unit, + null as category, + 'No' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) ) + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS DECIMAL) AS MonthsUntilRenewal + + + from ehr_compliancedb.employeerequirementexemptions a + Where a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) + + group by a.requirementname,a.employeeid + + UNION + + --- Additional requirements for employees that have not completed training, but is required + + select j.requirementname, + j.employeeid, + null as unit, + null as category, + 'Yes' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = j.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) + And yy.requirementname= j.requirementname and yy.employeeid= j.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) + And yy.requirementname= j.requirementname and yy.employeeid= j.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = j.requirementname and st.employeeid = j.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = j.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) ) + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod ) + + END AS DECIMAL) AS MonthsUntilRenewal + + + + from ehr_compliancedb.RequirementsPerEmployee j + Where j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) + And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) + + group by j.requirementname,j.employeeid + + order by employeeid,requirementname, mostrecentcompleted_date desc + + + If @@Error <> 0 + GoTo Err_Proc + + + + + RETURN 0 + + +Err_Proc: + + RETURN 1 + + +END + +GO + +EXEC core.fn_dropifexists 'p_ComplianceProcedureOverDueSoon_Process', 'onprc_ehr_compliancedb', 'PROCEDURE'; +GO + +-- Author: R. Blasa +-- Created: 9-20-2024 + +/* +** +** Created by +** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from +** the ComplianceProcedureRecentTest.sql query +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.p_ComplianceProcedureOverDueSoon_Process + + +AS + + + ----- Reset Reporting table + Delete onprc_ehr_compliancedb.ComplianceProcedureReport + + If @@Error <> 0 + GoTo Err_Proc + + + +BEGIN + + Insert into onprc_ehr_compliancedb.ComplianceProcedureReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + + ) + + + + + + select b.requirementname, + a.employeeid, + string_agg(a.unit,char(10)) as unit, + string_agg(a.category,char(10)) as category, + string_agg(b.trackingflag,char(10)) as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate()) ) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) + + + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate()) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS Float) AS MonthsUntilRenewal + + + + from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b + where ( a.unit = b.unit or a.category = b.category ) + And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And b.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) + + + group by b.requirementname,a.employeeid + + union + + select a.requirementname, + a.employeeid, + null as unit, + null as category, + 'None' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) + + + ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + from ehr_compliancedb.completiondates a + where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit + or k.category = h.category) And a.employeeid = k.employeeid ) + And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And a.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) + + group by a.requirementname,a.employeeid + + union + + -- Additional requirements for employees that have not completed training, but is required + select j.requirementname, + j.employeeid, + null as unit, + null as category, + 'Yes' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer + null as timesCompleted, + null as ExpiredPeriod, + null as NewExpirePeriod, + null as MostRecentDate, + '' as comment, + null as snooze_date, + null AS MonthsUntilRenewal + + + + from ehr_compliancedb.RequirementsPerEmployee j + Where j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) + And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) + + group by j.requirementname,j.employeeid + + order by employeeid,requirementname, mostrecentcompleted_date desc + + + If @@Error <> 0 + GoTo Err_Proc + + + + + RETURN 0 + + +Err_Proc: + + RETURN 1 + + +END + +GO + +CREATE TABLE onprc_ehr_compliancedb.RequirementsPerEmployee +( + RowId INT IDENTITY(1,1) NOT NULL, + EmployeeId varchar(255) not null, + RequirementName varchar(255) not null, + CreatedBy USERID, + Created datetime, + ModifiedBy USERID, + Modified datetime, + trackingflag varchar(100) + + CONSTRAINT PK_RequirementsPerEmployeename PRIMARY KEY (RowId) +); +GO + +EXEC core.fn_dropifexists 'p_ComplianceRecentOverDueSoon_Process', 'onprc_ehr_compliancedb', 'PROCEDURE'; +GO + +-- Author: R. Blasa +-- Created: 9-20-2024 + +/* +** +** Created by +** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from +** the ComplianceRecentTest.sql query +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.p_ComplianceRecentOverDueSoon_Process + + +AS + + + + ----- Reset Reporting table + Delete onprc_ehr_compliancedb.ComplianceRecentReport + + If @@Error <> 0 + GoTo Err_Proc + + + +BEGIN + + Insert into onprc_ehr_compliancedb.ComplianceRecentReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + + ) + + + + + select b.requirementname, + a.employeeid, + string_agg(a.unit,char(10)) as unit, + string_agg(a.category,char(10)) as category, + string_agg(b.trackingflag,char(10)) as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) + + + + + ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + + from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b + where ( a.unit = b.unit or a.category = b.category ) + And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And b.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) + + + group by b.requirementname,a.employeeid + + + union + + select a.requirementname, + a.employeeid, + null as unit, + null as category, + 'None' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) + + + ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + from ehr_compliancedb.completiondates a + where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit + or k.category = h.category) And a.employeeid = k.employeeid ) + And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And a.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) + + group by a.requirementname,a.employeeid + + UNION + + --- Training that was completed by as an employee training exemptions, and at least completed one, or more times + + select a.requirementname, + a.employeeid, + null as unit, + null as category, + 'No' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN + + ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) + + + ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS DECIMAL) AS MonthsUntilRenewal + + + from ehr_compliancedb.employeerequirementexemptions a + Where a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) + + group by a.requirementname,a.employeeid + + UNION + + --- Additional requirements for employees that have not completed training, but is required + + select j.requirementname, + j.employeeid, + null as unit, + null as category, + string_agg(j.trackingflag,char(10)) as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer + 0 as timesCompleted, + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = j.requirementname) as ExpiredPeriod, + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + null as MostRecentDate, + '' as comment, + null as snooze_date, + CAST( + CASE + + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = j.requirementname and st.employeeid = j.employeeid ) IS NULL then 0 + WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = j.requirementname group by tt.expireperiod ) = 0 then Null + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) + + + ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + from onprc_ehr_compliancedb.RequirementsPerEmployee j + Where j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) + And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) + And j.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit + or k.category = h.category) And j.employeeid = k.employeeid ) + And j.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where j.employeeid = t.employeeid And j.requirementname = t.requirementname) + And j.requirementname not in (select distinct k.requirementname from ehr_compliancedb.completiondates k Where k.employeeid = j.employeeid) + + group by j.requirementname,j.employeeid + + order by employeeid,requirementname, mostrecentcompleted_date desc + + + If @@Error <> 0 + GoTo Err_Proc + + + + + RETURN 0 + + +Err_Proc: + + RETURN 1 + + +END + +GO + +EXEC core.fn_dropifexists 'p_ComplianceProcedureOverDueSoon_Process', 'onprc_ehr_compliancedb', 'PROCEDURE'; +GO + +-- Author: R. Blasa +-- Created: 9-20-2024 + +/* +** +** Created by +** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from +** the ComplianceProcedureRecentTest.sql query +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.p_ComplianceProcedureOverDueSoon_Process + + +AS + + + ----- Reset Reporting table + Delete onprc_ehr_compliancedb.ComplianceProcedureReport + + If @@Error <> 0 + GoTo Err_Proc + + + +BEGIN + + Insert into onprc_ehr_compliancedb.ComplianceProcedureReport + ( + requirementname, + employeeid, + unit, + category, + trackingflag, + email, + lastname, + firstname, + host, + supervisor, + trainee_type, + requirement_name_type, + times_completed, + expired_period, + new_expired_Period, + mostrecentcompleted_date, + comment, + snooze_date, + months_until_renewal + + ) + + + + + + select b.requirementname, + a.employeeid, + string_agg(a.unit,char(10)) as unit, + string_agg(a.category,char(10)) as category, + string_agg(b.trackingflag,char(10)) as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate()) ) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) + + + ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate()) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS Float) AS MonthsUntilRenewal + + + + from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b + where ( a.unit = b.unit or a.category = b.category ) + And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And b.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) + + + group by b.requirementname,a.employeeid + + union + + select a.requirementname, + a.employeeid, + null as unit, + null as category, + 'None' as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer + + + (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, + + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, + + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + + (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, + + (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, + + (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) + And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, + + CAST( + CASE + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 + WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) + + + ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + from ehr_compliancedb.completiondates a + where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit + or k.category = h.category) And a.employeeid = k.employeeid ) + And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid + And a.requirementname = t.requirementname) + And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) + And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) + + group by a.requirementname,a.employeeid + + union + + -- Additional requirements for employees that have not completed training, but is required + select j.requirementname, + j.employeeid, + null as unit, + null as category, + string_agg(j.trackingflag,char(10)) as trackingflag, + (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, + (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, + (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, + (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, + (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, + (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer + (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer + 0 as timesCompleted, + (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = j.requirementname) as ExpiredPeriod, + ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, + null as MostRecentDate, + '' as comment, + null as snooze_date, + CAST( + CASE + + WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = j.requirementname and st.employeeid = j.employeeid ) IS NULL then 0 + WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = j.requirementname group by tt.expireperiod ) = 0 then Null + + + WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN + + ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate + having (tt.reviewdate) > (max(pq.date)) ) + + + ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod ) + + END AS FLOAT) AS MonthsUntilRenewal + + + + from onprc_ehr_compliancedb.RequirementsPerEmployee j + Where j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) + And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) + And j.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit + or k.category = h.category) And j.employeeid = k.employeeid ) + And j.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where j.employeeid = t.employeeid And j.requirementname = t.requirementname) + And j.requirementname not in (select distinct k.requirementname from ehr_compliancedb.completiondates k Where k.employeeid = j.employeeid) + + group by j.requirementname,j.employeeid + + order by employeeid,requirementname, mostrecentcompleted_date desc + + + If @@Error <> 0 + GoTo Err_Proc + + + + + RETURN 0 + + +Err_Proc: + + RETURN 1 + + +END + +GO + +EXEC core.fn_dropifexists 'p_ComplianceAccesscontainerUpdate', 'onprc_ehr_compliancedb', 'PROCEDURE'; +GO + +-- Author: R. Blasa +-- Created: 10-2-2024 + +/* +** +** Created by +** Blasa 9-5-2025 Storedprocedure to update Compliance Access contaimer values and update +** Completion date records +** . +** +** +** +*/ + +CREATE Procedure onprc_ehr_compliancedb.p_ComplianceAccesscontainerUpdate + + + AS + + + +BEGIN + + ------ Update container value and include as part of the main Compliance module + +If exists(Select * from ehr_Compliancedb.CompletionDates ss where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ) +BEGIN + +Update ss +set ss.container = 'CD170458-C55F-102F-9907-5107380A54BE' ----Compliance folder on Prime Production + + from ehr_Compliancedb.CompletionDates ss +Where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ---Compliance Access folder on Prime Production + + If @@Error <> 0 + GoTo Err_Proc + +END + +ELSE ------ No new entries exit +BEGIN + +GOTO No_Records + +END + + + + +No_Records: + + RETURN 0 + + +Err_Proc: + -------Error Generated, Transfer process stopped + RETURN 1 + + +END + +GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.001-24.002.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.001-24.002.sql deleted file mode 100644 index 5525e33d3..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.001-24.002.sql +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Copyright (c) 2024-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - - - - --- Author: R. Blasa --- Created: 2-10-2024 --- Description: Stored procedure program process SciShield INitial Data - - -CREATE TABLE [onprc_ehr_compliancedb].[SciShieldTemp] ( - [searchID] [int] IDENTITY(100,1) NOT NULL, - [employeeid] [varchar](500) NULL, - [requirementname] [varchar](3000) NULL, - [completeddate] [smalldatetime] NULL, - [comment] [varchar](300) NULL, - [createddate] [smalldatetime] NULL, - [rowid] [int] NULL - ) ON [PRIMARY] - GO - -CREATE TABLE [onprc_ehr_compliancedb].[SciShieldMasterTemp]( - [searchID] [int] IDENTITY(100,1) NOT NULL, - [employeeid] [varchar](500) NULL, - [requirementname] [varchar](3000) NULL, - [completeddate] [smalldatetime] NULL, - [comment] [varchar](300) NULL, - [createddate] [smalldatetime] NULL, - [rowid] [int] NULL - ) ON [PRIMARY] - GO - - - --- Author: R. Blasa --- Created: 2-10-2024 - -/* -** -** Created by -** Blasa 1-25-2024 Import process from ScieShield To Prime Compliance Module -** -** Processed codes: Null ---Not Processed -** 1 ------ Successfully posted -** 2 --------- invalid Employeeid -** 3 --------- Undefined Requirement Name -** 4--------- Already exists Compliance module -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.[p_SciShieldToPrimeProcess] - - -AS - - -DECLARE - @SearchKey Int, - @TempsearchKey Int, - @requirementnameFinal varchar(2000), - @requirementnanme varchar(2000), - @employeeid varchar(500), - @Completiondate smalldatetime, - @SciShieldID int - - - - - -BEGIN - - ---- Reset temp table - - Delete onprc_ehr_compliancedb.SciShieldTemp - - - If @@Error <> 0 - GoTo Err_Proc - - -If exists(Select * from onprc_ehr_compliancedb.SciShield_Data where processed is null) -BEGIN - - Insert into onprc_ehr_compliancedb.SciShieldTemp - ( - employeeid, - requirementname, - completeddate, - createddate, - rowid - ) - - - select - employeeid, -------employeeid - requirementname, ----requirement name - date, ----completed Date - getdate(), --- created date - rowid --- SciShield unique id - - - from onprc_ehr_compliancedb.SciShield_Data - where processed is null - - order by employeeid, requirementname, date desc - - If @@Error <> 0 - GoTo Err_Proc - - END - -ELSE ------ No new entries exit - BEGIN - - GOTO No_Records - - END - - --- Initialize Varaibles - - Set @TempsearchKey = 0 - Set @SearchKey = 0 - - - - --- Start processing input records from SciShield - - - Select top 1 @searchkey = searchID from onprc_ehr_compliancedb.SciShieldTemp - order by searchID - - - - -While @TempSearchKey < @SearchKey - BEGIN - Set @requirementnameFinal = '' - Set @requirementnanme = '' - Set @employeeid = '' - Set @Completiondate = Null - Set @SciShieldID = Null - - - Select @employeeid =rtrim(ltrim(lower(employeeid))), @requirementnanme = requirementname, @completiondate = completeddate, @SciShieldID = rowid - from onprc_ehr_compliancedb.SciShieldTemp Where searchID = @Searchkey - - ---Validate requirementname - IF exists (Select * from onprc_ehr_compliancedb.SciShield_Reference_Data where label = @requirementnanme And columnname = 'requirementname' ) - BEGIN - - Select @requirementnameFinal = value from onprc_ehr_compliancedb.SciShield_Reference_Data where label = @requirementnanme And columnname = 'requirementname' - END - ELSE IF exists (Select * from ehr_compliancedb.requirements where requirementname = @requirementnanme) - BEGIN - Select @requirementnameFinal = requirementname from ehr_compliancedb.requirements where requirementname = @requirementnanme - END - - ELSE - BEGIN - Update ss - Set ss.processed = 3 - - From onprc_ehr_compliancedb.SciShield_Data ss Where ss.rowid = @SciShieldID - - If @@Error <> 0 - GoTo Err_Proc - - GOTO Next_Record - END - - ----validate if the record already exists - - IF exists( Select * from ehr_compliancedb.completiondates Where employeeid = @employeeid And requirementname = @requirementnameFinal - And date = @completiondate) - BEGIN - Update ss - Set ss.processed = 4 - - From onprc_ehr_compliancedb.SciShield_Data ss Where ss.rowid = @SciShieldID - - If @@Error <> 0 - GoTo Err_Proc - - GOTO Next_Record - END - - - ----validate if the employeeid is defined - - IF not exists( Select * from ehr_compliancedb.employees Where employeeid = @employeeid And enddate is null) - BEGIN - - Update ss - Set ss.processed = 2 - - From onprc_ehr_compliancedb.SciShield_Data ss Where ss.rowid = @SciShieldID - - - If @@Error <> 0 - GoTo Err_Proc - - GOTO Next_Record - - - - END ---- - - - ---- IF all previous version were validated proceed with the record insert - - - IF not exists( Select * from ehr_compliancedb.completiondates Where employeeid = @employeeid And requirementname = @requirementnameFinal - And date = @completiondate) - - BEGIN - Insert into ehr_compliancedb.completiondates - (employeeid, - requirementname, - date, - trainer, - container, - created, - createdby, - modified, - modifiedby - - ) - values( - @employeeid, - @requirementnameFinal, - @completiondate, - 'ONLINE TRAINING', - 'CD170458-C55F-102F-9907-5107380A54BE', - getdate(), - 2595, - getdate(), - 2595 - ) - If @@Error <> 0 - GoTo Err_Proc - - - - ----------- Set successful entry flag - - Update ss - Set ss.processed = 1 - - From onprc_ehr_compliancedb.SciShield_Data ss Where ss.rowid = @SciShieldID - - - If @@Error <> 0 - GoTo Err_Proc - -END ---- - - - - -Next_Record: - - - - Set @TempSearchkey = @SearchKey - - - Select Top 1 @Searchkey = searchID from onprc_ehr_compliancedb.SciShieldTemp - Where searchID > @TempSearchkey - Order by searchID - - - -END ---(While) - - - - ---- Create a master records of the last most recent entries - If exists (Select * from onprc_ehr_compliancedb.SciShieldTemp) - BEGiN - Insert into onprc_ehr_compliancedb.SciShieldMasterTemp - select - employeeid, - requirementname, - completeddate, - comment, - createddate, - rowid - - - from onprc_ehr_compliancedb.SciShieldTemp - - - If @@Error <> 0 - GoTo Err_Proc -END - -No_Records: - - RETURN 0 - - -Err_Proc: - -------Error Generated, Transfer process stopped - RETURN 1 - - -END - -GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.002-24.003.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.002-24.003.sql deleted file mode 100644 index 630b402f3..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.002-24.003.sql +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2024-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - - -CREATE INDEX IX_completiondates_trainer ON ehr_compliancedb.completiondates(trainer); -GO - --- Author: R. Blasa --- Created: 9-16-2024 - -/* -** -** Created by -** Blasa 9-16-2024 Storedprocedure to update Compliance Access contaimer values -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.[p_ComplianceAccesscontainerUpdate] - - -AS - - - -BEGIN - - ------ Update container value and include as part of the main Compliance module - -If exists(Select * from ehr_Compliancedb.CompletionDates ss where ss.container = '47F00C3F-5691-103D-8866-41AD310B2640' ) -BEGIN - - Update ss - set ss.container = 'CD170458-C55F-102F-9907-5107380A54BE' ----Compliance folder on Prime Production - - from ehr_Compliancedb.CompletionDates ss - Where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ---Compliance Access folder on Prime Production - - If @@Error <> 0 - GoTo Err_Proc - - END - -ELSE ------ No new entries exit - BEGIN - - GOTO No_Records - - END - - - - -No_Records: - - RETURN 0 - - -Err_Proc: - -------Error Generated, Transfer process stopped - RETURN 1 - - -END - -GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.003-24.004.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.003-24.004.sql deleted file mode 100644 index 4a89989b6..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.003-24.004.sql +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2024-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - - -EXEC core.fn_dropifexists 'p_ComplianceAccesscontainerUpdate', 'onprc_ehr_compliancedb', 'PROCEDURE'; -GO - --- Author: R. Blasa --- Created: 10-2-2024 - -/* -** -** Created by -** Blasa 9-16-2024 Storedprocedure to update Compliance Access contaimer values. -** 10-2-2024 Corrected Container values. -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.p_ComplianceAccesscontainerUpdate - - -AS - - - -BEGIN - - ------ Update container value and include as part of the main Compliance module - -If exists(Select * from ehr_Compliancedb.CompletionDates ss where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ) -BEGIN - - Update ss - set ss.container = 'CD170458-C55F-102F-9907-5107380A54BE' ----Compliance folder on Prime Production - - from ehr_Compliancedb.CompletionDates ss - Where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ---Compliance Access folder on Prime Production - - If @@Error <> 0 - GoTo Err_Proc - - END - -ELSE ------ No new entries exit - BEGIN - - GOTO No_Records - - END - - - - -No_Records: - - RETURN 0 - - -Err_Proc: - -------Error Generated, Transfer process stopped - RETURN 1 - - -END - -GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.004-24.005.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.004-24.005.sql deleted file mode 100644 index 447165f75..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.004-24.005.sql +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (c) 2024-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - - -EXEC core.fn_dropifexists 'p_ComplianceAccesscontainerUpdate', 'onprc_ehr_compliancedb', 'PROCEDURE'; -GO - --- Author: R. Blasa --- Created: 12-10-2024 - -/* -** -** Created by -** Blasa 12-10-2024 Storedprocedure to update string name "ARRS" to "DCM" -** -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.p_ComplianceTranslatestringUpdate - - -AS - - - -BEGIN - - ------ Update container value and include as part of the main Compliance module - -If exists(select * from ehr_compliancedb.EmployeePerUnit ------> count= 496 - where unit like '%arrs%' - ) -BEGIN - - Update ehr_compliancedb.EmployeePerUnit - set unit = replace(unit,'arrs', 'DCM') - - - - If @@Error <> 0 - GoTo Err_Proc - - END - - - If exists(select * from ehr_compliancedb.EmployeePerUnit ------> count= 496 - where category like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.EmployeePerUnit - set category = replace(category,'arrs', 'DCM') - - - - If @@Error <> 0 - GoTo Err_Proc - - END - - - - If exists(select * from ehr_compliancedb.Employees - where majorudds like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.Employees - set majorudds = replace(majorudds,'arrs', 'DCM') - - - - If @@Error <> 0 - GoTo Err_Proc - - END - - - - If exists(select * from ehr_compliancedb.Employees - where unit like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.Employees - set unit = replace(unit,'arrs', 'DCM') - - If @@Error <> 0 - GoTo Err_Proc - - END - - - - If exists(select * from ehr_compliancedb.Employees - where category like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.Employees - set category = replace(category,'arrs', 'DCM') - - If @@Error <> 0 - GoTo Err_Proc - - END - - - - If exists(select * from ehr_compliancedb.requirements - where requirementname like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.requirements - set requirementname = replace(requirementname,'arrs', 'DCM') - - - If @@Error <> 0 - GoTo Err_Proc - - END - - - - If exists(select * from ehr_compliancedb.EmployeeRequirementExemptions - where requirementname like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.EmployeeRequirementExemptions - set requirementname = replace(requirementname,'arrs', 'DCM') - - - If @@Error <> 0 - GoTo Err_Proc - - END - - - - - If exists(select * from ehr_compliancedb.unit_names - where unit like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.unit_names - set unit = replace(unit,'arrs', 'DCM') - - - - If @@Error <> 0 - GoTo Err_Proc - - END - - - If exists(select * from ehr_compliancedb.RequirementsPerCategory - where RequirementName like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.RequirementsPerCategory - set requirementname = replace(requirementname,'arrs', 'DCM') - - - - If @@Error <> 0 - GoTo Err_Proc - - END - - - If exists(select * from ehr_compliancedb.RequirementsPerCategory - where category like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.RequirementsPerCategory - set category = replace(category,'arrs', 'DCM') - - If @@Error <> 0 - GoTo Err_Proc - - END - - - If exists(select * from ehr_compliancedb.RequirementsPerCategory - where unit like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.RequirementsPerCategory - set unit = replace(unit,'arrs', 'DCM') - - - If @@Error <> 0 - GoTo Err_Proc - - END - - If exists(select * from ehr_compliancedb.completiondates - where requirementname like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.completiondates - set requirementname = replace(requirementname,'arrs', 'DCM') - - - If @@Error <> 0 - GoTo Err_Proc - - END - - If exists(select * from ehr_compliancedb.EmployeeCategory - where categoryname like '%arrs%' - ) - BEGIN - - Update ehr_compliancedb.EmployeeCategory - set categoryname = replace(categoryname ,'arrs', 'DCM') - - - If @@Error <> 0 - GoTo Err_Proc - - END - - - - - - - - -No_Records: - - RETURN 0 - - -Err_Proc: - -- - RETURN 1 - - -END - -GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.005-24.006.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.005-24.006.sql deleted file mode 100644 index 0a482897b..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.005-24.006.sql +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (c) 2025-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ --- Author: R. Blasa --- Created: 9-20-2024-2024 --- Description: Stored procedure program to create a static data set for Compliance Procedure Recent Test .sql - - - CREATE TABLE onprc_ehr_compliancedb.ComplianceProcedureReport( - [rowid] [int] IDENTITY(1,1) NOT NULL, - [employeeid] varchar(300) NULL, - [requirementname] [varchar](4000) NULL, - [unit] [varchar](500) NULL, - [category] [varchar](500) NULL, - [trackingflag] [varchar](100) NULL, - [email] [varchar](500) NULL, - [lastname] [varchar](500) NULL, - [firstname] [varchar](500) NULL, - [host] [varchar](500) NULL, - [supervisor] [varchar](500) NULL, - [trainee_type] [varchar](500) NULL, - [times_completed] [smallint] NULL, - [expired_period] [smallint] NULL, - [new_expired_period] [smallint] NULL, - [mostrecentcompleted_date] [smalldatetime] NULL, - [comment] [varchar](4000) NULL, - [snooze_date] [smalldatetime] NULL, - [months_until_renewal] [Float] NULL, - [requirement_name_type] [varchar](1000) NULL - - ) ON [PRIMARY] - GO - --- Author: R. Blasa --- Created: 9-20-2024 - -/* -** -** Created by -** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from -** the ComplianceProcedureRecentTest.sql query -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.p_ComplianceProcedureOverDueSoon_Process - - -AS - - - ----- Reset Reporting table - Delete onprc_ehr_compliancedb.ComplianceProcedureReport - - If @@Error <> 0 - GoTo Err_Proc - - - -BEGIN - - Insert into onprc_ehr_compliancedb.ComplianceProcedureReport - ( - requirementname, - employeeid, - unit, - category, - trackingflag, - email, - lastname, - firstname, - host, - supervisor, - trainee_type, - requirement_name_type, - times_completed, - expired_period, - new_expired_Period, - mostrecentcompleted_date, - comment, - snooze_date, - months_until_renewal - - ) - - - - - - select b.requirementname, - a.employeeid, - string_agg(a.unit,char(10)) as unit, - string_agg(a.category,char(10)) as category, - (select top 1 h.trackingflag from ehr_compliancedb.requirementspercategory h where h.requirementname = b.requirementname) as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate()) ) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) - - - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate()) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS Float) AS MonthsUntilRenewal - - - - from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b - where ( a.unit = b.unit or a.category = b.category ) - And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And b.requirementname = t.requirementname) - - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) - - - group by b.requirementname,a.employeeid - - - union - - select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'No' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select ( datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate()) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS Float) AS MonthsUntilRenewal - - - from ehr_compliancedb.completiondates a - where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And a.employeeid = k.employeeid ) - And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And a.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - group by a.requirementname,a.employeeid - - UNION - - -- Additional requirements for employees that have not completed training, but is required - select j.requirementname, - j.employeeid, - null as unit, - null as category, - 'Yes' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer - null as timesCompleted, - null as ExpiredPeriod, - null as NewExpirePeriod, - null as MostRecentDate, - '' as comment, - null as snooze_date, - null AS MonthsUntilRenewal - - - - from ehr_compliancedb.RequirementsPerEmployee j - Where j.requirementname not in (select z.requirementname from ehr_compliancedb.completiondates z where z.requirementname = j.requirementname - and z.employeeid = j.employeeid and z.date is not null) - And j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) - And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) - - group by j.requirementname,j.employeeid - - order by employeeid,requirementname, mostrecentcompleted_date desc - - - If @@Error <> 0 - GoTo Err_Proc - - - - - RETURN 0 - - -Err_Proc: - - RETURN 1 - - -END - -GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.006-24.007.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.006-24.007.sql deleted file mode 100644 index caddaf7a6..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.006-24.007.sql +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (c) 2025-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ --- Author: R. Blasa --- Created: 9-20-2024-2024 --- Description: Stored procedure program to create a static data set for Compliance Recent Test .sql - - - CREATE TABLE onprc_ehr_compliancedb.ComplianceRecentReport( - [rowid] [int] IDENTITY(1,1) NOT NULL, - [employeeid] varchar(300) NULL, - [requirementname] [varchar](4000) NULL, - [unit] [varchar](500) NULL, - [category] [varchar](500) NULL, - [trackingflag] [varchar](100) NULL, - [email] [varchar](500) NULL, - [lastname] [varchar](500) NULL, - [firstname] [varchar](500) NULL, - [host] [varchar](500) NULL, - [supervisor] [varchar](500) NULL, - [trainee_type] [varchar](500) NULL, - [times_completed] [smallint] NULL, - [expired_period] [smallint] NULL, - [new_expired_period] [smallint] NULL, - [mostrecentcompleted_date] [smalldatetime] NULL, - [comment] [varchar](4000) NULL, - [snooze_date] [smalldatetime] NULL, - [months_until_renewal] [FLOAT] NULL, - [requirement_name_type] [varchar](1000) NULL - - ) ON [PRIMARY] - GO - - --- Author: R. Blasa --- Created: 9-20-2024 - -/* -** -** Created by -** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from -** the ComplianceRecentTest.sql query -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.p_ComplianceRecentOverDueSoon_Process - - -AS - - - - ----- Reset Reporting table - Delete onprc_ehr_compliancedb.ComplianceRecentReport - - If @@Error <> 0 - GoTo Err_Proc - - - -BEGIN - - Insert into onprc_ehr_compliancedb.ComplianceRecentReport - ( - requirementname, - employeeid, - unit, - category, - trackingflag, - email, - lastname, - firstname, - host, - supervisor, - trainee_type, - requirement_name_type, - times_completed, - expired_period, - new_expired_Period, - mostrecentcompleted_date, - comment, - snooze_date, - months_until_renewal - - ) - - - - - select b.requirementname, - a.employeeid, - string_agg(a.unit,char(10)) as unit, - string_agg(a.category,char(10)) as category, - (select top 1 h.trackingflag from ehr_compliancedb.requirementspercategory h where h.requirementname = b.requirementname) as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) - - - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - - from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b - where ( a.unit = b.unit or a.category = b.category ) - And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And b.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) - - - group by b.requirementname,a.employeeid - - - union - - select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'No' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - from ehr_compliancedb.completiondates a - where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And a.employeeid = k.employeeid ) - And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And a.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - group by a.requirementname,a.employeeid - - UNION - - --- Training that was completed by as an employee training exemptions, and at least completed one, or more times - - select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'No' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) ) - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS DECIMAL) AS MonthsUntilRenewal - - - from ehr_compliancedb.employeerequirementexemptions a - Where a.requirementname in (select z.requirementname from ehr_compliancedb.completiondates z where z.requirementname = a.requirementname - and z.employeeid = a.employeeid and z.date is not null) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - group by a.requirementname,a.employeeid - - UNION - - --- Additional requirements for employees that have not completed training, but is required - - select j.requirementname, - j.employeeid, - null as unit, - null as category, - 'Yes' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = j.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) - And yy.requirementname= j.requirementname and yy.employeeid= j.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) - And yy.requirementname= j.requirementname and yy.employeeid= j.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = j.requirementname and st.employeeid = j.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = j.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) ) - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod ) - - END AS DECIMAL) AS MonthsUntilRenewal - - - - - - from ehr_compliancedb.RequirementsPerEmployee j - Where j.requirementname not in (select z.requirementname from ehr_compliancedb.completiondates z where z.requirementname = j.requirementname - and z.employeeid = j.employeeid and z.date is not null) - And j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) - And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) - - group by j.requirementname,j.employeeid - - order by employeeid,requirementname, mostrecentcompleted_date desc - - - If @@Error <> 0 - GoTo Err_Proc - - - - - RETURN 0 - - -Err_Proc: - - RETURN 1 - - -END - -GO diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.007-24.008.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.007-24.008.sql deleted file mode 100644 index 59a532cf6..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.007-24.008.sql +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright (c) 2025-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - - -EXEC core.fn_dropifexists 'p_ComplianceRecentOverDueSoon_Process', 'onprc_ehr_compliancedb', 'PROCEDURE'; -GO - --- Author: R. Blasa --- Created: 9-20-2024 - -/* -** -** Created by -** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from -** the ComplianceRecentTest.sql query -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.p_ComplianceRecentOverDueSoon_Process - - -AS - - - - ----- Reset Reporting table - Delete onprc_ehr_compliancedb.ComplianceRecentReport - - If @@Error <> 0 - GoTo Err_Proc - - - -BEGIN - - Insert into onprc_ehr_compliancedb.ComplianceRecentReport - ( - requirementname, - employeeid, - unit, - category, - trackingflag, - email, - lastname, - firstname, - host, - supervisor, - trainee_type, - requirement_name_type, - times_completed, - expired_period, - new_expired_Period, - mostrecentcompleted_date, - comment, - snooze_date, - months_until_renewal - - ) - - - - - select b.requirementname, - a.employeeid, - string_agg(a.unit,char(10)) as unit, - string_agg(a.category,char(10)) as category, - string_agg(b.trackingflag,char(10)) as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) - - - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - - from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b - where ( a.unit = b.unit or a.category = b.category ) - And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And b.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) - - - group by b.requirementname,a.employeeid - - - union - - select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'None' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - from ehr_compliancedb.completiondates a - where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And a.employeeid = k.employeeid ) - And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And a.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - group by a.requirementname,a.employeeid - - UNION - - --- Training that was completed by as an employee training exemptions, and at least completed one, or more times - - select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'No' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) ) - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS DECIMAL) AS MonthsUntilRenewal - - - from ehr_compliancedb.employeerequirementexemptions a - Where a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - group by a.requirementname,a.employeeid - - UNION - - --- Additional requirements for employees that have not completed training, but is required - - select j.requirementname, - j.employeeid, - null as unit, - null as category, - 'Yes' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = j.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) - And yy.requirementname= j.requirementname and yy.employeeid= j.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= j.requirementname and zz.employeeid= j.employeeid ) - And yy.requirementname= j.requirementname and yy.employeeid= j.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = j.requirementname and st.employeeid = j.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = j.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) ) - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod ) - - END AS DECIMAL) AS MonthsUntilRenewal - - - - from ehr_compliancedb.RequirementsPerEmployee j - Where j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) - And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) - - group by j.requirementname,j.employeeid - - order by employeeid,requirementname, mostrecentcompleted_date desc - - - If @@Error <> 0 - GoTo Err_Proc - - - - - RETURN 0 - - -Err_Proc: - - RETURN 1 - - -END - -GO diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.008-24.009.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.008-24.009.sql deleted file mode 100644 index 04054d61f..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.008-24.009.sql +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (c) 2025-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - - -EXEC core.fn_dropifexists 'p_ComplianceProcedureOverDueSoon_Process', 'onprc_ehr_compliancedb', 'PROCEDURE'; -GO - --- Author: R. Blasa --- Created: 9-20-2024 - -/* -** -** Created by -** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from -** the ComplianceProcedureRecentTest.sql query -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.p_ComplianceProcedureOverDueSoon_Process - - -AS - - - ----- Reset Reporting table - Delete onprc_ehr_compliancedb.ComplianceProcedureReport - - If @@Error <> 0 - GoTo Err_Proc - - - -BEGIN - - Insert into onprc_ehr_compliancedb.ComplianceProcedureReport - ( - requirementname, - employeeid, - unit, - category, - trackingflag, - email, - lastname, - firstname, - host, - supervisor, - trainee_type, - requirement_name_type, - times_completed, - expired_period, - new_expired_Period, - mostrecentcompleted_date, - comment, - snooze_date, - months_until_renewal - - ) - - - - - - select b.requirementname, - a.employeeid, - string_agg(a.unit,char(10)) as unit, - string_agg(a.category,char(10)) as category, - string_agg(b.trackingflag,char(10)) as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate()) ) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > ( datediff(month,max(pq.date), tt.reviewdate) ) ) - - - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate()) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS Float) AS MonthsUntilRenewal - - - - from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b - where ( a.unit = b.unit or a.category = b.category ) - And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And b.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) - - - group by b.requirementname,a.employeeid - - union - - select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'None' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (tt.expireperiod) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) )) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.expireperiod) > (datediff(month,max(pq.date), tt.reviewdate) ) ) - - - ELSE ( select (tt.expireperiod) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - from ehr_compliancedb.completiondates a - where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And a.employeeid = k.employeeid ) - And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And a.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - group by a.requirementname,a.employeeid - - union - - -- Additional requirements for employees that have not completed training, but is required - select j.requirementname, - j.employeeid, - null as unit, - null as category, - 'Yes' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer - null as timesCompleted, - null as ExpiredPeriod, - null as NewExpirePeriod, - null as MostRecentDate, - '' as comment, - null as snooze_date, - null AS MonthsUntilRenewal - - - - from ehr_compliancedb.RequirementsPerEmployee j - Where j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) - And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) - - group by j.requirementname,j.employeeid - - order by employeeid,requirementname, mostrecentcompleted_date desc - - - If @@Error <> 0 - GoTo Err_Proc - - - - - RETURN 0 - - -Err_Proc: - - RETURN 1 - - -END - -GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.009-24.010.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.009-24.010.sql deleted file mode 100644 index 7dc0f820e..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.009-24.010.sql +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright (c) 2025-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - -CREATE TABLE onprc_ehr_compliancedb.RequirementsPerEmployee -( - RowId INT IDENTITY(1,1) NOT NULL, - EmployeeId varchar(255) not null, - RequirementName varchar(255) not null, - CreatedBy USERID, - Created datetime, - ModifiedBy USERID, - Modified datetime, - trackingflag varchar(100) - - CONSTRAINT PK_RequirementsPerEmployeename PRIMARY KEY (RowId) -); -GO - -EXEC core.fn_dropifexists 'p_ComplianceRecentOverDueSoon_Process', 'onprc_ehr_compliancedb', 'PROCEDURE'; -GO - --- Author: R. Blasa --- Created: 9-20-2024 - -/* -** -** Created by -** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from -** the ComplianceRecentTest.sql query -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.p_ComplianceRecentOverDueSoon_Process - - -AS - - - - ----- Reset Reporting table - Delete onprc_ehr_compliancedb.ComplianceRecentReport - - If @@Error <> 0 - GoTo Err_Proc - - - -BEGIN - - Insert into onprc_ehr_compliancedb.ComplianceRecentReport - ( - requirementname, - employeeid, - unit, - category, - trackingflag, - email, - lastname, - firstname, - host, - supervisor, - trainee_type, - requirement_name_type, - times_completed, - expired_period, - new_expired_Period, - mostrecentcompleted_date, - comment, - snooze_date, - months_until_renewal - - ) - - - - - select b.requirementname, - a.employeeid, - string_agg(a.unit,char(10)) as unit, - string_agg(a.category,char(10)) as category, - string_agg(b.trackingflag,char(10)) as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) - - - - - ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - - from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b - where ( a.unit = b.unit or a.category = b.category ) - And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And b.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) - - - group by b.requirementname,a.employeeid - - - union - - select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'None' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) - - - ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - from ehr_compliancedb.completiondates a - where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And a.employeeid = k.employeeid ) - And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And a.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - group by a.requirementname,a.employeeid - - UNION - - --- Training that was completed by as an employee training exemptions, and at least completed one, or more times - - select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'No' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN - - ( select ( datediff(month,max(pq.date), tt.reviewdate) - (datediff(month,max(pq.date), getdate())) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) - - - ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS DECIMAL) AS MonthsUntilRenewal - - - from ehr_compliancedb.employeerequirementexemptions a - Where a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - group by a.requirementname,a.employeeid - - UNION - - --- Additional requirements for employees that have not completed training, but is required - - select j.requirementname, - j.employeeid, - null as unit, - null as category, - string_agg(j.trackingflag,char(10)) as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer - 0 as timesCompleted, - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = j.requirementname) as ExpiredPeriod, - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - null as MostRecentDate, - '' as comment, - null as snooze_date, - CAST( - CASE - - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = j.requirementname and st.employeeid = j.employeeid ) IS NULL then 0 - WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = j.requirementname group by tt.expireperiod ) = 0 then Null - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) - - - ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - from onprc_ehr_compliancedb.RequirementsPerEmployee j - Where j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) - And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) - And j.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And j.employeeid = k.employeeid ) - And j.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where j.employeeid = t.employeeid And j.requirementname = t.requirementname) - And j.requirementname not in (select distinct k.requirementname from ehr_compliancedb.completiondates k Where k.employeeid = j.employeeid) - - group by j.requirementname,j.employeeid - - order by employeeid,requirementname, mostrecentcompleted_date desc - - - If @@Error <> 0 - GoTo Err_Proc - - - - - RETURN 0 - - -Err_Proc: - - RETURN 1 - - -END - -GO diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.010-24.011.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.010-24.011.sql deleted file mode 100644 index e1e0a95d4..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.010-24.011.sql +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 2025-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - - -EXEC core.fn_dropifexists 'p_ComplianceProcedureOverDueSoon_Process', 'onprc_ehr_compliancedb', 'PROCEDURE'; -GO - --- Author: R. Blasa --- Created: 9-20-2024 - -/* -** -** Created by -** Blasa 9-20-2024 Created a storedprocedure to create a static set of data from -** the ComplianceProcedureRecentTest.sql query -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.p_ComplianceProcedureOverDueSoon_Process - - -AS - - - ----- Reset Reporting table - Delete onprc_ehr_compliancedb.ComplianceProcedureReport - - If @@Error <> 0 - GoTo Err_Proc - - - -BEGIN - - Insert into onprc_ehr_compliancedb.ComplianceProcedureReport - ( - requirementname, - employeeid, - unit, - category, - trackingflag, - email, - lastname, - firstname, - host, - supervisor, - trainee_type, - requirement_name_type, - times_completed, - expired_period, - new_expired_Period, - mostrecentcompleted_date, - comment, - snooze_date, - months_until_renewal - - ) - - - - - - select b.requirementname, - a.employeeid, - string_agg(a.unit,char(10)) as unit, - string_agg(a.category,char(10)) as category, - string_agg(b.trackingflag,char(10)) as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = b.requirementname) as requirement_type, - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as times_Completed, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = b.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) as mostrecentcompleted_date, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= b.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= b.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = b.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = b.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate()) ) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) - - - ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate()) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = b.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS Float) AS MonthsUntilRenewal - - - - from ehr_Compliancedb.employeeperunit a ,ehr_compliancedb.requirementspercategory b - where ( a.unit = b.unit or a.category = b.category ) - And b.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And b.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And b.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = b.requirementname And q.dateDisabled is null ) - - - group by b.requirementname,a.employeeid - - union - - select a.requirementname, - a.employeeid, - null as unit, - null as category, - 'None' as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = a.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = a.requirementname) as requirement_type, ----- type trainee, or trainer - - - (select count(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as timesCompleted, - - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = a.requirementname) as ExpiredPeriod, - - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - - (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) as MostRecentDate, - - (Select distinct string_agg(yy.comment, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as comment, - - (Select distinct string_agg(yy.snooze_date, char(10)) from ehr_compliancedb.completiondates yy where yy.date in (select max(zz.date) from ehr_compliancedb.completiondates zz where zz.requirementname= a.requirementname and zz.employeeid= a.employeeid ) - And yy.requirementname= a.requirementname and yy.employeeid= a.employeeid ) as snooze_date, - - CAST( - CASE - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = a.requirementname and st.employeeid = a.employeeid ) IS NULL then 0 - WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = a.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) - - - ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = a.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = a.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - from ehr_compliancedb.completiondates a - where a.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And a.employeeid = k.employeeid ) - And a.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where a.employeeid = t.employeeid - And a.requirementname = t.requirementname) - And a.employeeid in (select p.employeeid from ehr_compliancedb.employees p where a.employeeid = p.employeeid And p.enddate is null) - And a.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = a.requirementname And q.dateDisabled is null ) - - group by a.requirementname,a.employeeid - - union - - -- Additional requirements for employees that have not completed training, but is required - select j.requirementname, - j.employeeid, - null as unit, - null as category, - string_agg(j.trackingflag,char(10)) as trackingflag, - (select h.email from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as email, - (select h.lastname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as lastname, - (select h.firstname from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as firstname, - (select h.majorudds from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as host, - (select h.supervisor from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as supervisor, - (select h.type from ehr_compliancedb.employees h where h.employeeid = j.employeeid) as trainee_type, ----- type trainee, or trainer - (select h.type from ehr_compliancedb.Requirements h where h.requirementname = j.requirementname) as requirement_type, ----- type trainee, or trainer - 0 as timesCompleted, - (select k.expireperiod from ehr_compliancedb.Requirements k where k.requirementname = j.requirementname) as ExpiredPeriod, - ( select (datediff(month,max(pq.date), tt.reviewdate) )from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (COALESCE(tt.expireperiod,0)) > (datediff(month,max(pq.date), tt.reviewdate)) and (tt.reviewdate is not null) ) as NewExpirePeriod, - null as MostRecentDate, - '' as comment, - null as snooze_date, - CAST( - CASE - - WHEN (select max(st.date) from ehr_compliancedb.completiondates st where st.requirementname = j.requirementname and st.employeeid = j.employeeid ) IS NULL then 0 - WHEN ( select (COALESCE(tt.expireperiod,0)) from ehr_compliancedb.requirements tt where tt.requirementname = j.requirementname group by tt.expireperiod ) = 0 then Null - - - WHEN ( select count(*) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) > 0 THEN - - ( select (datediff(month,max(pq.date), tt.reviewdate) - ( datediff(month,max(pq.date), getdate())) ) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod, tt.reviewdate - having (tt.reviewdate) > (max(pq.date)) ) - - - ELSE ( select (COALESCE(tt.expireperiod,0)) - ( datediff(month,max(pq.date), getdate())) from ehr_compliancedb.requirements tt, ehr_compliancedb.completiondates pq where tt.requirementname = j.requirementname and pq.requirementname = tt.requirementname and pq.employeeid = j.employeeid group by tt.expireperiod ) - - END AS FLOAT) AS MonthsUntilRenewal - - - - from onprc_ehr_compliancedb.RequirementsPerEmployee j - Where j.employeeid in (select p.employeeid from ehr_compliancedb.employees p where j.employeeid = p.employeeid And p.enddate is null) - And j.requirementname in (select q.requirementname from ehr_compliancedb.Requirements q where q.requirementname = j.requirementname And q.dateDisabled is null ) - And j.requirementname not in (select distinct h.requirementname from ehr_compliancedb.employeeperunit k, ehr_compliancedb.requirementspercategory h Where (k.unit = h.unit - or k.category = h.category) And j.employeeid = k.employeeid ) - And j.requirementname not in (select distinct t.requirementname from ehr_compliancedb.employeerequirementexemptions t Where j.employeeid = t.employeeid And j.requirementname = t.requirementname) - And j.requirementname not in (select distinct k.requirementname from ehr_compliancedb.completiondates k Where k.employeeid = j.employeeid) - - group by j.requirementname,j.employeeid - - order by employeeid,requirementname, mostrecentcompleted_date desc - - - If @@Error <> 0 - GoTo Err_Proc - - - - - RETURN 0 - - -Err_Proc: - - RETURN 1 - - -END - -GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.011-24.012.sql b/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.011-24.012.sql deleted file mode 100644 index 1879e1faa..000000000 --- a/ONPRC_EHR_ComplianceDB/resources/schemas/dbscripts/sqlserver/onprc_ehr_compliancedb-24.011-24.012.sql +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2025-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -EXEC core.fn_dropifexists 'p_ComplianceAccesscontainerUpdate', 'onprc_ehr_compliancedb', 'PROCEDURE'; -GO - --- Author: R. Blasa --- Created: 10-2-2024 - -/* -** -** Created by -** Blasa 9-5-2025 Storedprocedure to update Compliance Access contaimer values and update -** Completion date records -** . -** -** -** -*/ - -CREATE Procedure onprc_ehr_compliancedb.p_ComplianceAccesscontainerUpdate - - - AS - - - -BEGIN - - ------ Update container value and include as part of the main Compliance module - -If exists(Select * from ehr_Compliancedb.CompletionDates ss where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ) -BEGIN - -Update ss -set ss.container = 'CD170458-C55F-102F-9907-5107380A54BE' ----Compliance folder on Prime Production - - from ehr_Compliancedb.CompletionDates ss -Where ss.container = 'F1C05E2D-618D-103D-ABC9-9814909BFFCD' ---Compliance Access folder on Prime Production - - If @@Error <> 0 - GoTo Err_Proc - -END - -ELSE ------ No new entries exit -BEGIN - -GOTO No_Records - -END - - - - -No_Records: - - RETURN 0 - - -Err_Proc: - -------Error Generated, Transfer process stopped - RETURN 1 - - -END - -GO \ No newline at end of file diff --git a/ONPRC_EHR_ComplianceDB/src/org/labkey/ONPRCEHR_ComplianceDB/ONPRC_EHR_ComplianceDBModule.java b/ONPRC_EHR_ComplianceDB/src/org/labkey/ONPRCEHR_ComplianceDB/ONPRC_EHR_ComplianceDBModule.java index f49fac062..424382756 100644 --- a/ONPRC_EHR_ComplianceDB/src/org/labkey/ONPRCEHR_ComplianceDB/ONPRC_EHR_ComplianceDBModule.java +++ b/ONPRC_EHR_ComplianceDB/src/org/labkey/ONPRCEHR_ComplianceDB/ONPRC_EHR_ComplianceDBModule.java @@ -55,8 +55,8 @@ public String getName() @Override public Double getSchemaVersion() { - return 25.001; - } //Modified: 9-8-025 + return 26.000; + } @Override public @NotNull Collection getSchemaNames() diff --git a/extscheduler/module.properties b/extscheduler/module.properties index cfa1b282e..85ac54a44 100644 --- a/extscheduler/module.properties +++ b/extscheduler/module.properties @@ -1,5 +1,5 @@ Name: extscheduler ModuleClass: org.labkey.extscheduler.ExtSchedulerModule -SupportedDatabases: mssql +SupportedDatabases: mssql, pgsql RequiredServerVersion: 15.2 -ManageVersion: false +ManageVersion: true diff --git a/extscheduler/resources/schemas/dbscripts/postgresql/extscheduler-0.000-25.000.sql b/extscheduler/resources/schemas/dbscripts/postgresql/extscheduler-0.000-25.000.sql new file mode 100644 index 000000000..b49efd0ae --- /dev/null +++ b/extscheduler/resources/schemas/dbscripts/postgresql/extscheduler-0.000-25.000.sql @@ -0,0 +1,68 @@ +CREATE SCHEMA extscheduler; + +CREATE TABLE extscheduler.Resources +( + Id SERIAL NOT NULL, + Name VARCHAR(255) NOT NULL, + Color VARCHAR(20), + Room VARCHAR(255), + Bldg VARCHAR(255), + Instance VARCHAR(50), + + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + + CONSTRAINT PK_resources PRIMARY KEY (Id), + CONSTRAINT UQ_resources_ContainerName UNIQUE (Container, Name) +); + +CREATE TABLE extscheduler.Events +( + Id SERIAL NOT NULL, + ResourceId INT NOT NULL, + Name VARCHAR(255), + StartDate TIMESTAMP NOT NULL, + EndDate TIMESTAMP NOT NULL, + UserId USERID NOT NULL, + Alias VARCHAR(25), + Quantity INT, + Comments VARCHAR(4000), + + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + + CONSTRAINT PK_events PRIMARY KEY (Id), + CONSTRAINT FK_events_ResourceId FOREIGN KEY (ResourceId) REFERENCES extscheduler.Resources(Id), + CONSTRAINT CHK_event_DateRangeValid CHECK (StartDate <= EndDate) +); + +CREATE OR REPLACE FUNCTION extscheduler.tr_overlappingdateranges() RETURNS TRIGGER AS $$ +BEGIN + IF EXISTS( + SELECT 1 FROM extscheduler.events R + LEFT JOIN ( + SELECT ObjectId, Value FROM prop.Properties + JOIN prop.PropertySets ON PropertySets.Set = Properties.Set + WHERE Name = 'ExtSchedulerAllowEventOverlap' + ) P ON R.Container = P.ObjectId + WHERE (P.Value IS NULL OR P.Value = 'false') AND ( + (R.Container = NEW.Container AND R.ResourceId = NEW.ResourceId AND R.StartDate < NEW.EndDate AND NEW.StartDate < R.EndDate) + AND NOT (R.Id = NEW.Id) + ) + ) THEN + RAISE EXCEPTION 'Start/End date ranges may not overlap for the same resource.'; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER TR_OverlappingDateRanges + BEFORE INSERT OR UPDATE ON extscheduler.events + FOR EACH ROW + EXECUTE FUNCTION extscheduler.tr_overlappingdateranges(); diff --git a/extscheduler/resources/schemas/dbscripts/postgresql/extscheduler-26.001-26.002.sql b/extscheduler/resources/schemas/dbscripts/postgresql/extscheduler-26.001-26.002.sql new file mode 100644 index 000000000..24d2efb56 --- /dev/null +++ b/extscheduler/resources/schemas/dbscripts/postgresql/extscheduler-26.001-26.002.sql @@ -0,0 +1,15 @@ +/* + * Drop the 2020 Covid-19 scheduling scaffolding. The dateParts window these procedures read is frozen at + * 2020-05-01 through 2021-04-20, so they can only ever generate events dated 2020-2021. extBlockOutEvening + * additionally violates CHK_event_DateRangeValid -- its StartDate is date + 1530 hours, a 15:30 clock time + * misread as an hour count -- and has never inserted a row. + */ + +-- Note: The bootstrap script doesn't create these procedures or the table. This clean up is here for only a few +-- development machines that ran a previous version of the bootstrap script. When consolidation takes place, these +-- statements can simply be removed. + +DROP PROCEDURE IF EXISTS extscheduler."extBlockOutEvening"; +DROP PROCEDURE IF EXISTS extscheduler."extBlockOutMorning"; +DROP PROCEDURE IF EXISTS extscheduler."extBlockOutDays"; +DROP TABLE IF EXISTS extscheduler."dateParts"; diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-0.000-25.000.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-0.000-25.000.sql new file mode 100644 index 000000000..e665d02d7 --- /dev/null +++ b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-0.000-25.000.sql @@ -0,0 +1,568 @@ +CREATE SCHEMA extscheduler; +GO + +CREATE TABLE extscheduler.Resources +( + Id INT IDENTITY(1,1) NOT NULL, + Name VARCHAR(255) NOT NULL, + Color VARCHAR(20), + + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + + CONSTRAINT PK_resources PRIMARY KEY (Id), + CONSTRAINT UQ_resources_ContainerName UNIQUE (Container, Name) +); + +CREATE TABLE extscheduler.Events +( + Id INT IDENTITY(1,1) NOT NULL, + ResourceId INT NOT NULL, + Name VARCHAR(255) NOT NULL, + StartDate DATETIME NOT NULL, + EndDate DATETIME NOT NULL, + UserId USERID NOT NULL, + + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + + CONSTRAINT PK_events PRIMARY KEY (Id), + CONSTRAINT FK_events_ResourceId FOREIGN KEY (ResourceId) REFERENCES extscheduler.resources(Id), + CONSTRAINT UQ_events_ContainerResourceName UNIQUE (Container, ResourceId, Name) +); + +/* 15.xxx SQL scripts */ + +ALTER TABLE extscheduler.Resources Add Room VARCHAR(255); +ALTER TABLE extscheduler.Resources Add Bldg VARCHAR (255); + + +ALTER TABLE extscheduler.Events ADD Alias VARCHAR(25); + +CREATE TABLE extscheduler.users +( + Id INT IDENTITY(1,1) NOT NULL, + PrimeUserID USERID NOT NULL, + FirstName VARCHAR(255) NOT NULL, + LastName Varchar(255) NOT NULL, + Email VARCHAR(255) NOT NULL, + Phone VARCHAR(255), + Department VARCHAR(255), + Lab_FirstName VARCHAR(255), + Lab_LastName VARCHAR(255), + FiscalAuthority_Name VARCHAR(255), + FiscalAuthority_Phone VARCHAR(255), + SecurityLevel VARCHAR(255), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + + CONSTRAINT PK_users PRIMARY KEY (Id), + CONSTRAINT FK_users_PrimeUserID FOREIGN KEY (PrimeUserID) REFERENCES core.Usersdata(UserId), + CONSTRAINT UQ_users_ContainerPrimeUserID UNIQUE (Container, PrimeUserID) +); + +DROP TABLE extscheduler.users; + + +CREATE TABLE extscheduler.users +( + Id INT IDENTITY(1,1) NOT NULL, + PrimeUserID USERID NOT NULL, + FirstName VARCHAR(255) NOT NULL, + LastName Varchar(255) NOT NULL, + Email VARCHAR(255) NOT NULL, + Phone VARCHAR(255), + Department VARCHAR(255), + Lab_FirstName VARCHAR(255), + Lab_LastName VARCHAR(255), + FiscalAuthority_Name VARCHAR(255), + FiscalAuthority_Phone VARCHAR(255), + SecurityLevel VARCHAR(255), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + + CONSTRAINT PK_users PRIMARY KEY (Id), + CONSTRAINT FK_users_PrimeUserID FOREIGN KEY (PrimeUserID) REFERENCES core.Usersdata(UserId), + CONSTRAINT UQ_users_ContainerPrimeUserID UNIQUE (Container, PrimeUserID) +); + +ALTER TABLE extscheduler.events DROP CONSTRAINT UQ_events_ContainerResourceName; +ALTER TABLE extscheduler.events ADD CONSTRAINT CHK_event_DateRangeValid CHECK (StartDate <= EndDate); + +GO + +CREATE TRIGGER TR_OverlappingDateRanges ON extscheduler.events FOR INSERT, UPDATE AS +BEGIN + IF EXISTS( + SELECT 1 FROM extscheduler.events R + INNER JOIN inserted I + ON ( + (R.Container = I.Container AND R.ResourceId = I.ResourceId AND R.StartDate < I.EndDate AND I.StartDate < R.EndDate) + AND NOT (R.Container = I.Container AND R.ResourceId = I.ResourceId AND R.StartDate = I.StartDate AND I.EndDate = R.EndDate) + ) + ) + BEGIN + RAISERROR('Start/End date ranges may not overlap for the same resource.', 16, 1) + ROLLBACK + END +END + +GO + +ALTER TABLE extscheduler.events ALTER COLUMN Name VARCHAR(255) NULL; + +DROP TABLE extscheduler.users; + +GO + +ALTER TRIGGER extscheduler.TR_OverlappingDateRanges ON extscheduler.Events FOR INSERT, UPDATE AS +BEGIN + IF EXISTS( + SELECT 1 FROM extscheduler.events R + INNER JOIN inserted I + ON ( + (R.Container = I.Container AND R.ResourceId = I.ResourceId AND R.StartDate < I.EndDate AND I.StartDate < R.EndDate) + AND NOT (R.Id = I.Id) + ) + ) + BEGIN + RAISERROR('Start/End date ranges may not overlap for the same resource.', 16, 1) + ROLLBACK + END +END + +GO + +ALTER TABLE extscheduler.Events ADD Quantity INT; + +ALTER TABLE extscheduler.Events ADD Comments VARCHAR(255); + +GO + +ALTER TRIGGER extscheduler.TR_OverlappingDateRanges ON extscheduler.Events FOR INSERT, UPDATE AS +BEGIN + IF EXISTS( + SELECT 1 FROM extscheduler.events R + LEFT JOIN ( + SELECT ObjectId, Value FROM prop.Properties + JOIN prop.PropertySets ON PropertySets."Set" = Properties."Set" + WHERE Name = 'ExtSchedulerAllowEventOverlap' + ) P ON R.Container = P.ObjectId + INNER JOIN inserted I + ON (P.Value IS NULL OR P.Value = 'false') AND ( + (R.Container = I.Container AND R.ResourceId = I.ResourceId AND R.StartDate < I.EndDate AND I.StartDate < R.EndDate) + AND NOT (R.Id = I.Id) + ) + ) + BEGIN + RAISERROR('Start/End date ranges may not overlap for the same resource.', 16, 1) + ROLLBACK + END +END + +GO + +/* 20.xxx SQL scripts */ + +/* +Created: 2020-05-07 +Created by jonesga +Purpose: Update of Comments field of scheduler per user request + +*/ +ALTER TABLE extscheduler.Events ALTER COLUMN Comments NVARCHAR(4000); + +/* +Created: 2020-05-07 +Created by jonesga +Purpose: Dataset to mimic DateRange from Labkey for SCheduler actionin SQL + +*/ +EXEC core.fn_dropifexists 'DateParts','extScheduler','TABLE'; +GO + +CREATE TABLE extScheduler.dateParts +(date datetime, +dateOnly datetime, +DayOfYear int, +DayofMonth int, +DayofWeek int, +DayName varchar(20), + +WeekofMonth int, +WeekofYear int, + Month int, + year int) + +Go + +Insert into extScheduler.DateParts + (Date, + dateonly, + DayOfYear, + DayofMonth, + DayofWeek, + DayName, + WeekofMonth, + WeekofYear, + Month, + year) +Select + + i.NDate, + CAST(i.Ndate as date) as dateOnly, + cast(datepart(dy,i.Ndate) as integer) as DayOfYear, + cast(datepart(dd,i.Ndate) as integer) as DayOfMonth, + cast(datepart(dw,i.Ndate) as integer) as DayOfWeek, + cast(dateName(dd,i.Ndate) as VarChar(20)) as DayName, + (cast(datepart(dd,i.Ndate) as integer)/ 7) as WeekofMonth, + cast(datepart(wk,i.Ndate) as integer) as WeekofYear, + cast(datepart(mm,i.Ndate) as integer) as Month, + cast(datepart(yyyy,i.Ndate) as integer) as Year +FROM (SELECT DateAdd(dd, i.value, '5/1/2020') as NDate FROM ldk.integers i)i +Where i.nDate <= '4/20/2021' + +-- ================================================ +-- Template generated from Template Explorer using: +-- Create Procedure (New Menu).SQL +-- +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter +-- values below. +-- +-- This block of comments will not be included in +-- the definition of the procedure. +-- ================================================ +-- ============================================= +-- Author: jonesga@ohsu.edu +-- Create date: 2020-05-13 +-- Description: PRocedure to Block out Scheduling for Covid19 testing for 3:30 to 7 PM on Monday and Friday +-- ============================================= +EXEC core.fn_dropifexists 'extBlockOutEvening', 'extscheduler', 'PROCEDURE' +GO + +CREATE PROCEDURE extscheduler.extBlockOutEvening + -- Add the parameters for the stored procedure here + @Month INTEGER, @ResourceID INTEGER +AS +BEGIN + + INSERT INTO [extscheduler].[Events] + ([ResourceId] + ,[Name] + ,[StartDate] + ,[EndDate] + ,[UserId] + ,[Container] + ,[CreatedBy] + ,[Created] + ,[Quantity] + ,[Comments]) + + SELECT @ResourceID + ,'No Covid-19 Testing' + ,DateAdd(hh,1530,c.date) as StartDate + ,DateAdd(hh,19,c.date) as EndDate + ,1003 + ,'5C3C9FF8-6BCF-1038-930A-7D62F3A605B4' + ,1003 + ,GetDate() + ,1 + ,'Insert by ISE' + FROM [Labkey].[extscheduler].[dateParts] c + where c.dayofWeek in (2,6) and c.Month = @Month +--Days of Week start with Sunday + + + +END +GO + +/****** Object: StoredProcedure [extscheduler].[extBlockOutMorning] Script Date: 5/13/2020 6:10:00 AM ******/ +-- ================================================ +-- Template generated from Template Explorer using: +-- Create Procedure (New Menu).SQL +-- +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter +-- values below. +-- +-- This block of comments will not be included in +-- the definition of the procedure. +-- ================================================ +-- ============================================= +-- Author: jonesga@ohsu.edu +-- Create date: 2020-05-13 +-- Description: PRocedure to Block out Scheduling for Covid19 testing for 7 to 8 on Monday and Friday +-- ============================================= +EXEC core.fn_dropifexists 'extBlockOutMorning', 'extscheduler', 'PROCEDURE' +GO + +CREATE PROCEDURE [extscheduler].[extBlockOutMorning] + -- Add the parameters for the stored procedure here + @Month INTEGER, @ResourceID INTEGER +AS +BEGIN + + INSERT INTO [extscheduler].[Events] + ([ResourceId] + ,[Name] + ,[StartDate] + ,[EndDate] + ,[UserId] + ,[Container] + ,[CreatedBy] + ,[Created] + ,[Quantity] + ,[Comments]) + + SELECT @ResourceID + ,'No Covid-19 Testing' + ,DateAdd(hh,7,c.date) as StartDate + ,DateAdd(hh,8,c.date) as EndDate + ,1003 + ,'5C3C9FF8-6BCF-1038-930A-7D62F3A605B4' + ,1003 + ,GetDate() + ,1 + ,'Insert by ISE' + FROM [Labkey].[extscheduler].[dateParts] c + where c.dayofWeek in (2,6) and c.Month = @Month +--Days of Week start with Sunday + +END + +GO + +-- /****** Object: StoredProcedure [extscheduler].[extBlockOutDays] Script Date: 5/13/2020 6:12:06 AM ******/ +-- ================================================ +-- Template generated from Template Explorer using: +-- Create Procedure (New Menu).SQL +-- +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter +-- values below. +-- +-- This block of comments will not be included in +-- the definition of the procedure. +-- ================================================ +-- ============================================= +-- Author: jonesga@ohsu.edu +-- Create date: 2020-05-13 +-- Description: PRocedure to Block out Scheduling for Covid19 testing for all days except Monday and Friday +-- ============================================= +EXEC core.fn_dropifexists 'extBlockOutDays', 'extscheduler', 'PROCEDURE' +GO + +CREATE PROCEDURE [extscheduler].[extBlockOutDays] + -- Add the parameters for the stored procedure here + @Month INTEGER, @ResourceID INTEGER +AS +BEGIN + + INSERT INTO [extscheduler].[Events] + ([ResourceId] + ,[Name] + ,[StartDate] + ,[EndDate] + ,[UserId] + ,[Container] + ,[CreatedBy] + ,[Created] + ,[Quantity] + ,[Comments]) + + SELECT @ResourceID + ,'No Covid-19 Testing' + ,DateAdd(hh,7,c.date) as StartDate + ,DateAdd(hh,19,c.date) as EndDate + ,1003 + ,'5C3C9FF8-6BCF-1038-930A-7D62F3A605B4' + ,1003 + ,GetDate() + ,1 + ,'Insert by ISE' + FROM [Labkey].[extscheduler].[dateParts] c + where c.dayofWeek in (1,3,4,5,7) and c.Month = @Month +--Days of Week start with Sunday + +END + +GO + +EXEC core.fn_dropifexists 'vw_Covid19Research', 'extScheduler', 'VIEW', NULL; +GO + +CREATE VIEW extScheduler.vw_Covid19Research AS +SELECT extscheduler.Events.Id AS SChedulerID, extscheduler.Events.ResourceId, extscheduler.Resources.Name AS ResourceName, extscheduler.Events.Name, extscheduler.Events.StartDate, extscheduler.Events.UserId, + extscheduler.Events.CreatedBy, extscheduler.Events.Created, extscheduler.Events.Quantity, core.UsersData.IM AS EmployeeID +FROM extscheduler.Events LEFT OUTER JOIN + core.UsersData ON extscheduler.Events.UserId = core.UsersData.UserId LEFT OUTER JOIN + extscheduler.Resources ON extscheduler.Events.ResourceId = extscheduler.Resources.Id +WHERE (extscheduler.Events.ResourceId = 67); + +GO + +EXEC core.fn_dropifexists 'vw_Covid19DCMSchedule', 'extScheduler', 'VIEW', NULL; +GO + +CREATE VIEW extScheduler.vw_Covid19DCMSchedule AS +SELECT extscheduler.Events.Id AS SChedulerID, extscheduler.Events.ResourceId, extscheduler.Resources.Name AS ResourceName, extscheduler.Events.Name, extscheduler.Events.StartDate, extscheduler.Events.UserId, + extscheduler.Events.CreatedBy, extscheduler.Events.Created, extscheduler.Events.Quantity, core.UsersData.IM AS EmployeeID + FROM extscheduler.Events LEFT OUTER JOIN + core.UsersData ON extscheduler.Events.UserId = core.UsersData.UserId LEFT OUTER JOIN + extscheduler.Resources ON extscheduler.Events.ResourceId = extscheduler.Resources.Id + WHERE (extscheduler.Resources.Name LIKE 'DCM%'); + +GO + +/****** Object: Table [list].[c10437d746_covid19testing] Script Date: 9/16/2020 9:19:28 AM ******/ +EXEC core.fn_dropifexists 'Covid19Testing', 'extScheduler', 'TABLE', NULL; +GO + +CREATE TABLE [extScheduler].[Covid19Testing]( + [container] [dbo].[ENTITYID] NOT NULL, + [entityId] [dbo].[ENTITYID] NOT NULL, + [lastIndexed] [datetime] NULL, + [createdBy] [int] NULL, + [modified] [datetime] NULL, + [modifiedBy] [int] NULL, + [created] [datetime] NULL, + [Key] [int] IDENTITY(1,1) NOT NULL, + [SchedulerID] [int] NULL, + [ResourceID] [int] NULL, + [UserName] [nvarchar](4000) NULL, + [UserID] [int] NULL, + [EmployeeID] [nvarchar](4000) NULL, + [ScheduledDate] [datetime] NULL, + [ScheduledTime] [datetime] NULL, + [Create] [datetime] NULL, + [SampleDate] [nvarchar](4000) NULL, + [CreatedB] [nvarchar](4000) NULL, + [ComplianceUpdated] [bit] NULL, + CONSTRAINT [covid19testing_pk] PRIMARY KEY CLUSTERED +( +[Key] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) ON [PRIMARY] + GO + +/****** Object: Table [list].[c10437d746_covid19testing] Script Date: 9/16/2020 9:19:28 AM ******/ +EXEC core.fn_dropifexists 'Covid19Testing', 'extScheduler', 'TABLE', NULL; +GO + +CREATE TABLE [extScheduler].[Covid19Testing]( + [container] [dbo].[ENTITYID] NOT NULL, + [entityId] [dbo].[ENTITYID] NOT NULL, + [lastIndexed] [datetime] NULL, + [createdBy] [int] NULL, + [modified] [datetime] NULL, + [modifiedBy] [int] NULL, + [created] [datetime] NULL, + [Key] [int] IDENTITY(1,1) NOT NULL, + [SchedulerID] [int] NULL, + [ResourceID] [int] NULL, + [UserName] [nvarchar](4000) NULL, + [UserID] [int] NULL, + [EmployeeID] [nvarchar](4000) NULL, + [ScheduledDate] [datetime] NULL, + [ScheduledTime] [datetime] NULL, + [Create] [datetime] NULL, + [SampleDate] [nvarchar](4000) NULL, + [CreatedB] [nvarchar](4000) NULL, + [ComplianceUpdated] [bit] NULL, + CONSTRAINT [covid19testingKey_pk] PRIMARY KEY CLUSTERED +( +[Key] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) ON [PRIMARY] + GO + +EXEC core.fn_dropifexists 'TempScheduler', 'extScheduler', 'TABLE', NULL; +GO + +CREATE TABLE [extscheduler].[TempScheduler]( + [Searchkey] [int] IDENTITY(100,1) NOT NULL, + [usernames] [varchar](500) NULL, + [EventId] [varchar](max) NULL, + [StartDate] [smalldatetime] NULL, + [created] [smalldatetime] NULL + ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + GO + +EXEC core.fn_dropifexists 'TempCoV19Interim', 'extScheduler', 'TABLE', NULL; +GO + +/****** Object: Table [extscheduler].[TempScheduler] + ONCE TESTED CHAN GE TO labkey_public + Script Date: 10/29/2020 8:19:18 AM ******/ + +CREATE TABLE [extscheduler].[TempCoV19Interim]( + [EventId] [varchar](max) NULL, + [UserName] [nvarchar](1000) NULL, + [container] [varchar](max) NULL, + [notes] nvarchar(100) null + ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + GO + +EXEC core.fn_dropifexists 'TempCoV19Interim', 'extScheduler', 'TABLE', NULL; +GO + +CREATE TABLE [extscheduler].[TempCoV19Interim]( + [EventId] [varchar](max) NULL, + [UserName] [nvarchar](1000) NULL, + [container] [varchar](max) NULL + ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + GO + +EXEC core.fn_dropifexists 'TempCoV19Final', 'extScheduler', 'TABLE', NULL; + GO + +CREATE TABLE [extscheduler].[TempCoV19Final]( + [container] [uniqueidentifier] NOT NULL, + [UserName] [nvarchar](4000) NULL, + [UserID] [int] NULL, + [EventID] [int] NULL, + [StartDate] [smalldatetime] NULL, + [EmployeeID] [nvarchar](4000) NULL, + [Created] [smalldatetime] NULL + ) ON [PRIMARY] + GO + +/* 21.xxx SQL scripts */ + +ALTER TABLE extscheduler.Resources ADD Instance varchar(50); + +/* 23.xxx SQL scripts */ + +EXEC core.fn_dropifexists 'TempCoV19Final', 'extScheduler', 'TABLE', NULL; + GO +EXEC core.fn_dropifexists 'covid19testing', 'extScheduler', 'TABLE', NULL; +GO + +EXEC core.fn_dropifexists 'tempscheduler', 'extScheduler', 'TABLE', NULL; +GO + +EXEC core.fn_dropifexists 'TempCoV19Interim', 'extScheduler', 'TABLE', NULL; +GO + +EXEC core.fn_dropifexists 'vw_Covid19Research', 'extScheduler', 'VIEW', NULL; +GO + +EXEC core.fn_dropifexists 'vw_covid19dcmschedule', 'extScheduler', 'VIEW', NULL; +GO + +EXEC core.fn_dropifexists 'vw_Covid19DCMDaily', 'extScheduler', 'VIEW', NULL; +GO \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.20-15.21.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.20-15.21.sql deleted file mode 100644 index 6b39703e0..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.20-15.21.sql +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2016-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -CREATE SCHEMA extscheduler; -GO - -CREATE TABLE extscheduler.Resources -( - Id INT IDENTITY(1,1) NOT NULL, - Name VARCHAR(255) NOT NULL, - Color VARCHAR(20), - - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - - CONSTRAINT PK_resources PRIMARY KEY (Id), - CONSTRAINT UQ_resources_ContainerName UNIQUE (Container, Name) -); - -CREATE TABLE extscheduler.Events -( - Id INT IDENTITY(1,1) NOT NULL, - ResourceId INT NOT NULL, - Name VARCHAR(255) NOT NULL, - StartDate DATETIME NOT NULL, - EndDate DATETIME NOT NULL, - UserId USERID NOT NULL, - - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - - CONSTRAINT PK_events PRIMARY KEY (Id), - CONSTRAINT FK_events_ResourceId FOREIGN KEY (ResourceId) REFERENCES extscheduler.resources(Id), - CONSTRAINT UQ_events_ContainerResourceName UNIQUE (Container, ResourceId, Name) -); \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.21-15.22.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.21-15.22.sql deleted file mode 100644 index 6176c8cf4..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.21-15.22.sql +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2016-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - -ALTER TABLE extscheduler.Resources Add Room VARCHAR(255); -ALTER TABLE extscheduler.Resources Add Bldg VARCHAR (255); - - -ALTER TABLE extscheduler.Events ADD Alias VARCHAR(25); \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.22-15.23.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.22-15.23.sql deleted file mode 100644 index d5330742e..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.22-15.23.sql +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2016-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -CREATE TABLE extscheduler.users -( - Id INT IDENTITY(1,1) NOT NULL, - PrimeUserID USERID NOT NULL, - FirstName VARCHAR(255) NOT NULL, - LastName Varchar(255) NOT NULL, - Email VARCHAR(255) NOT NULL, - Phone VARCHAR(255), - Department VARCHAR(255), - Lab_FirstName VARCHAR(255), - Lab_LastName VARCHAR(255), - FiscalAuthority_Name VARCHAR(255), - FiscalAuthority_Phone VARCHAR(255), - SecurityLevel VARCHAR(255), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - - CONSTRAINT PK_users PRIMARY KEY (Id), - CONSTRAINT FK_users_PrimeUserID FOREIGN KEY (PrimeUserID) REFERENCES core.Usersdata(UserId), - CONSTRAINT UQ_users_ContainerPrimeUserID UNIQUE (Container, PrimeUserID) -); diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.23-15.24.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.23-15.24.sql deleted file mode 100644 index e755bca0f..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.23-15.24.sql +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2016-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -DROP TABLE extscheduler.users; - - -CREATE TABLE extscheduler.users -( - Id INT IDENTITY(1,1) NOT NULL, - PrimeUserID USERID NOT NULL, - FirstName VARCHAR(255) NOT NULL, - LastName Varchar(255) NOT NULL, - Email VARCHAR(255) NOT NULL, - Phone VARCHAR(255), - Department VARCHAR(255), - Lab_FirstName VARCHAR(255), - Lab_LastName VARCHAR(255), - FiscalAuthority_Name VARCHAR(255), - FiscalAuthority_Phone VARCHAR(255), - SecurityLevel VARCHAR(255), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - - CONSTRAINT PK_users PRIMARY KEY (Id), - CONSTRAINT FK_users_PrimeUserID FOREIGN KEY (PrimeUserID) REFERENCES core.Usersdata(UserId), - CONSTRAINT UQ_users_ContainerPrimeUserID UNIQUE (Container, PrimeUserID) -); diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.24-15.25.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.24-15.25.sql deleted file mode 100644 index bebbd9fca..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.24-15.25.sql +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2016-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -ALTER TABLE extscheduler.events DROP CONSTRAINT UQ_events_ContainerResourceName; -ALTER TABLE extscheduler.events ADD CONSTRAINT CHK_event_DateRangeValid CHECK (StartDate <= EndDate); - -GO - -CREATE TRIGGER TR_OverlappingDateRanges ON extscheduler.events FOR INSERT, UPDATE AS -BEGIN - IF EXISTS( - SELECT 1 FROM extscheduler.events R - INNER JOIN inserted I - ON ( - (R.Container = I.Container AND R.ResourceId = I.ResourceId AND R.StartDate < I.EndDate AND I.StartDate < R.EndDate) - AND NOT (R.Container = I.Container AND R.ResourceId = I.ResourceId AND R.StartDate = I.StartDate AND I.EndDate = R.EndDate) - ) - ) - BEGIN - RAISERROR('Start/End date ranges may not overlap for the same resource.', 16, 1) - ROLLBACK - END -END \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.25-15.26.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.25-15.26.sql deleted file mode 100644 index e43356abd..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.25-15.26.sql +++ /dev/null @@ -1,6 +0,0 @@ -/* - * Copyright (c) 2016-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -ALTER TABLE extscheduler.events ALTER COLUMN Name VARCHAR(255) NULL; diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.26-15.27.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.26-15.27.sql deleted file mode 100644 index dcc2c9b06..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.26-15.27.sql +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright (c) 2016-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - -DROP TABLE extscheduler.users; \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.27-15.28.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.27-15.28.sql deleted file mode 100644 index e37bc3536..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.27-15.28.sql +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2016-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - -ALTER TRIGGER extscheduler.TR_OverlappingDateRanges ON extscheduler.Events FOR INSERT, UPDATE AS -BEGIN - IF EXISTS( - SELECT 1 FROM extscheduler.events R - INNER JOIN inserted I - ON ( - (R.Container = I.Container AND R.ResourceId = I.ResourceId AND R.StartDate < I.EndDate AND I.StartDate < R.EndDate) - AND NOT (R.Id = I.Id) - ) - ) - BEGIN - RAISERROR('Start/End date ranges may not overlap for the same resource.', 16, 1) - ROLLBACK - END -END \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.28-15.29.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.28-15.29.sql deleted file mode 100644 index b96ad1f6b..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.28-15.29.sql +++ /dev/null @@ -1,6 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -ALTER TABLE extscheduler.Events ADD Quantity INT; \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.29-15.30.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.29-15.30.sql deleted file mode 100644 index 4852063e6..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.29-15.30.sql +++ /dev/null @@ -1,6 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -ALTER TABLE extscheduler.Events ADD Comments VARCHAR(255); \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.30-15.31.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.30-15.31.sql deleted file mode 100644 index 62913035e..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-15.30-15.31.sql +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - -ALTER TRIGGER extscheduler.TR_OverlappingDateRanges ON extscheduler.Events FOR INSERT, UPDATE AS -BEGIN - IF EXISTS( - SELECT 1 FROM extscheduler.events R - LEFT JOIN ( - SELECT ObjectId, Value FROM prop.Properties - JOIN prop.PropertySets ON PropertySets."Set" = Properties."Set" - WHERE Name = 'ExtSchedulerAllowEventOverlap' - ) P ON R.Container = P.ObjectId - INNER JOIN inserted I - ON (P.Value IS NULL OR P.Value = 'false') AND ( - (R.Container = I.Container AND R.ResourceId = I.ResourceId AND R.StartDate < I.EndDate AND I.StartDate < R.EndDate) - AND NOT (R.Id = I.Id) - ) - ) - BEGIN - RAISERROR('Start/End date ranges may not overlap for the same resource.', 16, 1) - ROLLBACK - END -END \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.02-20.03.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.02-20.03.sql deleted file mode 100644 index ba2c12364..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.02-20.03.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -/* -Created: 2020-05-07 -Created by jonesga -Purpose: Update of Comments field of scheduler per user request - -*/ -ALTER TABLE extscheduler.Events ALTER COLUMN Comments NVARCHAR(4000); \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.502-20.503.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.502-20.503.sql deleted file mode 100644 index d02fb9cd7..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.502-20.503.sql +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -/* -Created: 2020-05-07 -Created by jonesga -Purpose: Dataset to mimic DateRange from Labkey for SCheduler actionin SQL - -*/ -EXEC core.fn_dropifexists 'DateParts','extScheduler','TABLE'; -GO - -CREATE TABLE extScheduler.dateParts -(date datetime, -dateOnly datetime, -DayOfYear int, -DayofMonth int, -DayofWeek int, -DayName varchar(20), - -WeekofMonth int, -WeekofYear int, - Month int, - year int) - -Go - -Insert into extScheduler.DateParts - (Date, - dateonly, - DayOfYear, - DayofMonth, - DayofWeek, - DayName, - WeekofMonth, - WeekofYear, - Month, - year) -Select - - i.NDate, - CAST(i.Ndate as date) as dateOnly, - cast(datepart(dy,i.Ndate) as integer) as DayOfYear, - cast(datepart(dd,i.Ndate) as integer) as DayOfMonth, - cast(datepart(dw,i.Ndate) as integer) as DayOfWeek, - cast(dateName(dd,i.Ndate) as VarChar(20)) as DayName, - (cast(datepart(dd,i.Ndate) as integer)/ 7) as WeekofMonth, - cast(datepart(wk,i.Ndate) as integer) as WeekofYear, - cast(datepart(mm,i.Ndate) as integer) as Month, - cast(datepart(yyyy,i.Ndate) as integer) as Year -FROM (SELECT DateAdd(dd, i.value, '5/1/2020') as NDate FROM ldk.integers i)i -Where i.nDate <= '4/20/2021' \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.503-20.504.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.503-20.504.sql deleted file mode 100644 index d3717ac89..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.503-20.504.sql +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ --- ================================================ --- Template generated from Template Explorer using: --- Create Procedure (New Menu).SQL --- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter --- values below. --- --- This block of comments will not be included in --- the definition of the procedure. --- ================================================ --- ============================================= --- Author: jonesga@ohsu.edu --- Create date: 2020-05-13 --- Description: PRocedure to Block out Scheduling for Covid19 testing for 3:30 to 7 PM on Monday and Friday --- ============================================= -EXEC core.fn_dropifexists 'extBlockOutEvening', 'extscheduler', 'PROCEDURE' -GO - -CREATE PROCEDURE extscheduler.extBlockOutEvening - -- Add the parameters for the stored procedure here - @Month INTEGER, @ResourceID INTEGER -AS -BEGIN - - INSERT INTO [extscheduler].[Events] - ([ResourceId] - ,[Name] - ,[StartDate] - ,[EndDate] - ,[UserId] - ,[Container] - ,[CreatedBy] - ,[Created] - ,[Quantity] - ,[Comments]) - - SELECT @ResourceID - ,'No Covid-19 Testing' - ,DateAdd(hh,1530,c.date) as StartDate - ,DateAdd(hh,19,c.date) as EndDate - ,1003 - ,'5C3C9FF8-6BCF-1038-930A-7D62F3A605B4' - ,1003 - ,GetDate() - ,1 - ,'Insert by ISE' - FROM [Labkey].[extscheduler].[dateParts] c - where c.dayofWeek in (2,6) and c.Month = @Month ---Days of Week start with Sunday - - - -END -GO diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.504-20.505.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.504-20.505.sql deleted file mode 100644 index c2bc89e5f..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.504-20.505.sql +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -/****** Object: StoredProcedure [extscheduler].[extBlockOutMorning] Script Date: 5/13/2020 6:10:00 AM ******/ --- ================================================ --- Template generated from Template Explorer using: --- Create Procedure (New Menu).SQL --- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter --- values below. --- --- This block of comments will not be included in --- the definition of the procedure. --- ================================================ --- ============================================= --- Author: jonesga@ohsu.edu --- Create date: 2020-05-13 --- Description: PRocedure to Block out Scheduling for Covid19 testing for 7 to 8 on Monday and Friday --- ============================================= -EXEC core.fn_dropifexists 'extBlockOutMorning', 'extscheduler', 'PROCEDURE' -GO - -CREATE PROCEDURE [extscheduler].[extBlockOutMorning] - -- Add the parameters for the stored procedure here - @Month INTEGER, @ResourceID INTEGER -AS -BEGIN - - INSERT INTO [extscheduler].[Events] - ([ResourceId] - ,[Name] - ,[StartDate] - ,[EndDate] - ,[UserId] - ,[Container] - ,[CreatedBy] - ,[Created] - ,[Quantity] - ,[Comments]) - - SELECT @ResourceID - ,'No Covid-19 Testing' - ,DateAdd(hh,7,c.date) as StartDate - ,DateAdd(hh,8,c.date) as EndDate - ,1003 - ,'5C3C9FF8-6BCF-1038-930A-7D62F3A605B4' - ,1003 - ,GetDate() - ,1 - ,'Insert by ISE' - FROM [Labkey].[extscheduler].[dateParts] c - where c.dayofWeek in (2,6) and c.Month = @Month ---Days of Week start with Sunday - -END - -GO diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.505-20.506.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.505-20.506.sql deleted file mode 100644 index 1239f39b9..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.505-20.506.sql +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ --- /****** Object: StoredProcedure [extscheduler].[extBlockOutDays] Script Date: 5/13/2020 6:12:06 AM ******/ --- ================================================ --- Template generated from Template Explorer using: --- Create Procedure (New Menu).SQL --- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter --- values below. --- --- This block of comments will not be included in --- the definition of the procedure. --- ================================================ --- ============================================= --- Author: jonesga@ohsu.edu --- Create date: 2020-05-13 --- Description: PRocedure to Block out Scheduling for Covid19 testing for all days except Monday and Friday --- ============================================= -EXEC core.fn_dropifexists 'extBlockOutDays', 'extscheduler', 'PROCEDURE' -GO - -CREATE PROCEDURE [extscheduler].[extBlockOutDays] - -- Add the parameters for the stored procedure here - @Month INTEGER, @ResourceID INTEGER -AS -BEGIN - - INSERT INTO [extscheduler].[Events] - ([ResourceId] - ,[Name] - ,[StartDate] - ,[EndDate] - ,[UserId] - ,[Container] - ,[CreatedBy] - ,[Created] - ,[Quantity] - ,[Comments]) - - SELECT @ResourceID - ,'No Covid-19 Testing' - ,DateAdd(hh,7,c.date) as StartDate - ,DateAdd(hh,19,c.date) as EndDate - ,1003 - ,'5C3C9FF8-6BCF-1038-930A-7D62F3A605B4' - ,1003 - ,GetDate() - ,1 - ,'Insert by ISE' - FROM [Labkey].[extscheduler].[dateParts] c - where c.dayofWeek in (1,3,4,5,7) and c.Month = @Month ---Days of Week start with Sunday - -END - -GO diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.601-20.602.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.601-20.602.sql deleted file mode 100644 index 0cb7df59c..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.601-20.602.sql +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -/* - * Created 2020-06-09 - * Created by jonesga - * Purpose - View joining Scheduler Resources, Events and the User Data - */ -EXEC core.fn_dropifexists 'vw_Covid19Research', 'extScheduler', 'VIEW', NULL; -GO - -CREATE VIEW extScheduler.vw_Covid19Research AS -SELECT extscheduler.Events.Id AS SChedulerID, extscheduler.Events.ResourceId, extscheduler.Resources.Name AS ResourceName, extscheduler.Events.Name, extscheduler.Events.StartDate, extscheduler.Events.UserId, - extscheduler.Events.CreatedBy, extscheduler.Events.Created, extscheduler.Events.Quantity, core.UsersData.IM AS EmployeeID -FROM extscheduler.Events LEFT OUTER JOIN - core.UsersData ON extscheduler.Events.UserId = core.UsersData.UserId LEFT OUTER JOIN - extscheduler.Resources ON extscheduler.Events.ResourceId = extscheduler.Resources.Id -WHERE (extscheduler.Events.ResourceId = 67) diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.602-20.603.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.602-20.603.sql deleted file mode 100644 index bc1137845..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.602-20.603.sql +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2020-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -/* - * Created 2020-06-09 - * Created by jonesga - * Purpose - View joining Scheduler Resources, Events and the User Data - */ -EXEC core.fn_dropifexists 'vw_Covid19DCMSchedule', 'extScheduler', 'VIEW', NULL; -GO - -CREATE VIEW extScheduler.vw_Covid19DCMSchedule AS -SELECT extscheduler.Events.Id AS SChedulerID, extscheduler.Events.ResourceId, extscheduler.Resources.Name AS ResourceName, extscheduler.Events.Name, extscheduler.Events.StartDate, extscheduler.Events.UserId, - extscheduler.Events.CreatedBy, extscheduler.Events.Created, extscheduler.Events.Quantity, core.UsersData.IM AS EmployeeID - FROM extscheduler.Events LEFT OUTER JOIN - core.UsersData ON extscheduler.Events.UserId = core.UsersData.UserId LEFT OUTER JOIN - extscheduler.Resources ON extscheduler.Events.ResourceId = extscheduler.Resources.Id - WHERE (extscheduler.Resources.Name LIKE 'DCM%') diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.901-20.902.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.901-20.902.sql deleted file mode 100644 index 99a0bce16..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.901-20.902.sql +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2021-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - -/****** Object: Table [list].[c10437d746_covid19testing] Script Date: 9/16/2020 9:19:28 AM ******/ -EXEC core.fn_dropifexists 'Covid19Testing', 'extScheduler', 'TABLE', NULL; -GO - -CREATE TABLE [extScheduler].[Covid19Testing]( - [container] [dbo].[ENTITYID] NOT NULL, - [entityId] [dbo].[ENTITYID] NOT NULL, - [lastIndexed] [datetime] NULL, - [createdBy] [int] NULL, - [modified] [datetime] NULL, - [modifiedBy] [int] NULL, - [created] [datetime] NULL, - [Key] [int] IDENTITY(1,1) NOT NULL, - [SchedulerID] [int] NULL, - [ResourceID] [int] NULL, - [UserName] [nvarchar](4000) NULL, - [UserID] [int] NULL, - [EmployeeID] [nvarchar](4000) NULL, - [ScheduledDate] [datetime] NULL, - [ScheduledTime] [datetime] NULL, - [Create] [datetime] NULL, - [SampleDate] [nvarchar](4000) NULL, - [CreatedB] [nvarchar](4000) NULL, - [ComplianceUpdated] [bit] NULL, - CONSTRAINT [covid19testing_pk] PRIMARY KEY CLUSTERED -( -[Key] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - ) ON [PRIMARY] - GO - diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.903-20.904.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.903-20.904.sql deleted file mode 100644 index 0cffcc9e1..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.903-20.904.sql +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2021-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ - -/****** Object: Table [list].[c10437d746_covid19testing] Script Date: 9/16/2020 9:19:28 AM ******/ -EXEC core.fn_dropifexists 'Covid19Testing', 'extScheduler', 'TABLE', NULL; -GO - -CREATE TABLE [extScheduler].[Covid19Testing]( - [container] [dbo].[ENTITYID] NOT NULL, - [entityId] [dbo].[ENTITYID] NOT NULL, - [lastIndexed] [datetime] NULL, - [createdBy] [int] NULL, - [modified] [datetime] NULL, - [modifiedBy] [int] NULL, - [created] [datetime] NULL, - [Key] [int] IDENTITY(1,1) NOT NULL, - [SchedulerID] [int] NULL, - [ResourceID] [int] NULL, - [UserName] [nvarchar](4000) NULL, - [UserID] [int] NULL, - [EmployeeID] [nvarchar](4000) NULL, - [ScheduledDate] [datetime] NULL, - [ScheduledTime] [datetime] NULL, - [Create] [datetime] NULL, - [SampleDate] [nvarchar](4000) NULL, - [CreatedB] [nvarchar](4000) NULL, - [ComplianceUpdated] [bit] NULL, - CONSTRAINT [covid19testingKey_pk] PRIMARY KEY CLUSTERED -( -[Key] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - ) ON [PRIMARY] - GO - diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.910-20.911.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.910-20.911.sql deleted file mode 100644 index 6e2fdf446..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.910-20.911.sql +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2021-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -EXEC core.fn_dropifexists 'TempScheduler', 'extScheduler', 'TABLE', NULL; -GO - -CREATE TABLE [extscheduler].[TempScheduler]( - [Searchkey] [int] IDENTITY(100,1) NOT NULL, - [usernames] [varchar](500) NULL, - [EventId] [varchar](max) NULL, - [StartDate] [smalldatetime] NULL, - [created] [smalldatetime] NULL - ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] - GO diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.911-20.912.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.911-20.912.sql deleted file mode 100644 index 763e59fa7..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.911-20.912.sql +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2021-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -EXEC core.fn_dropifexists 'TempCoV19Interim', 'extScheduler', 'TABLE', NULL; -GO - -/****** Object: Table [extscheduler].[TempScheduler] - ONCE TESTED CHAN GE TO labkey_public - Script Date: 10/29/2020 8:19:18 AM ******/ - -CREATE TABLE [extscheduler].[TempCoV19Interim]( - [EventId] [varchar](max) NULL, - [UserName] [nvarchar](1000) NULL, - [container] [varchar](max) NULL, - [notes] nvarchar(100) null - ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] - GO diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.922-20.923.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.922-20.923.sql deleted file mode 100644 index 4a3e9df02..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.922-20.923.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (c) 2021-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -EXEC core.fn_dropifexists 'TempCoV19Interim', 'extScheduler', 'TABLE', NULL; -GO - -CREATE TABLE [extscheduler].[TempCoV19Interim]( - [EventId] [varchar](max) NULL, - [UserName] [nvarchar](1000) NULL, - [container] [varchar](max) NULL - ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] - GO diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.936-20.937.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.936-20.937.sql deleted file mode 100644 index 9b1c6a5bc..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-20.936-20.937.sql +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2021-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -EXEC core.fn_dropifexists 'TempCoV19Final', 'extScheduler', 'TABLE', NULL; - GO - -CREATE TABLE [extscheduler].[TempCoV19Final]( - [container] [uniqueidentifier] NOT NULL, - [UserName] [nvarchar](4000) NULL, - [UserID] [int] NULL, - [EventID] [int] NULL, - [StartDate] [smalldatetime] NULL, - [EmployeeID] [nvarchar](4000) NULL, - [Created] [smalldatetime] NULL - ) ON [PRIMARY] - GO diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-21.001-21.002.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-21.001-21.002.sql deleted file mode 100644 index ae1fe3916..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-21.001-21.002.sql +++ /dev/null @@ -1,6 +0,0 @@ -/* - * Copyright (c) 2021-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -ALTER TABLE extscheduler.Resources ADD Instance varchar(50); \ No newline at end of file diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-23.001-23.002.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-23.001-23.002.sql deleted file mode 100644 index feb4b4bd7..000000000 --- a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-23.001-23.002.sql +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2023-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -EXEC core.fn_dropifexists 'TempCoV19Final', 'extScheduler', 'TABLE', NULL; - GO -EXEC core.fn_dropifexists 'covid19testing', 'extScheduler', 'TABLE', NULL; -GO - -EXEC core.fn_dropifexists 'tempscheduler', 'extScheduler', 'TABLE', NULL; -GO - -EXEC core.fn_dropifexists 'TempCoV19Interim', 'extScheduler', 'TABLE', NULL; -GO - -EXEC core.fn_dropifexists 'vw_Covid19Research', 'extScheduler', 'VIEW', NULL; -GO - -EXEC core.fn_dropifexists 'vw_covid19dcmschedule', 'extScheduler', 'VIEW', NULL; -GO - -EXEC core.fn_dropifexists 'vw_Covid19DCMDaily', 'extScheduler', 'VIEW', NULL; -GO diff --git a/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-26.000-26.001.sql b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-26.000-26.001.sql new file mode 100644 index 000000000..4093b705d --- /dev/null +++ b/extscheduler/resources/schemas/dbscripts/sqlserver/extscheduler-26.000-26.001.sql @@ -0,0 +1,18 @@ +/* + * Drop the 2020 Covid-19 scheduling scaffolding. The dateParts window these procedures read is frozen at + * 2020-05-01 through 2021-04-20, so they can only ever generate events dated 2020-2021. extBlockOutEvening + * additionally violates CHK_event_DateRangeValid -- its StartDate is date + 1530 hours, a 15:30 clock time + * misread as an hour count -- and has never inserted a row. + */ + +EXEC core.fn_dropifexists 'extBlockOutEvening', 'extscheduler', 'PROCEDURE'; +GO + +EXEC core.fn_dropifexists 'extBlockOutMorning', 'extscheduler', 'PROCEDURE'; +GO + +EXEC core.fn_dropifexists 'extBlockOutDays', 'extscheduler', 'PROCEDURE'; +GO + +EXEC core.fn_dropifexists 'dateParts', 'extscheduler', 'TABLE'; +GO diff --git a/extscheduler/resources/schemas/extscheduler.xml b/extscheduler/resources/schemas/extscheduler.xml index 5656d835d..a4771c6e8 100644 --- a/extscheduler/resources/schemas/extscheduler.xml +++ b/extscheduler/resources/schemas/extscheduler.xml @@ -100,20 +100,4 @@ - - - - - - - - - - - - - -
- - diff --git a/extscheduler/src/org/labkey/extscheduler/ExtSchedulerModule.java b/extscheduler/src/org/labkey/extscheduler/ExtSchedulerModule.java index 6adefebab..bfc1287a8 100644 --- a/extscheduler/src/org/labkey/extscheduler/ExtSchedulerModule.java +++ b/extscheduler/src/org/labkey/extscheduler/ExtSchedulerModule.java @@ -41,6 +41,12 @@ public String getName() @Override public @Nullable Double getSchemaVersion() + { + return 26.002; + } + + @Override + public double getEarliestUpgradeVersion() { return 23.002; } diff --git a/mergesync/build.gradle b/mergesync/build.gradle deleted file mode 100644 index cc66e7e0f..000000000 --- a/mergesync/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2016-2026 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. - */ -import org.labkey.gradle.util.BuildUtils; - -plugins { - id 'org.labkey.build.module' -} - -dependencies { - BuildUtils.addLabKeyDependency(project: project, config: "implementation", depProjectPath: ":server:modules:ehrModules:ehr", depProjectConfig: "apiJarFile") - BuildUtils.addLabKeyDependency(project: project, config: "implementation", depProjectPath: ":server:modules:LabDevKitModules:LDK", depProjectConfig: "apiJarFile") -} diff --git a/mergesync/module.properties b/mergesync/module.properties deleted file mode 100644 index a6d6304b2..000000000 --- a/mergesync/module.properties +++ /dev/null @@ -1,3 +0,0 @@ -ModuleClass: org.labkey.mergesync.MergeSyncModule -ManageVersion: false -SupportedDatabases: mssql, pgsql diff --git a/mergesync/resources/module.xml b/mergesync/resources/module.xml deleted file mode 100644 index 0c59021b4..000000000 --- a/mergesync/resources/module.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - true - The is the URL of the merge website - - ADMIN - - - - diff --git a/mergesync/resources/queries/mergesync/merge_results/.qview.xml b/mergesync/resources/queries/mergesync/merge_results/.qview.xml deleted file mode 100644 index 717fe81fa..000000000 --- a/mergesync/resources/queries/mergesync/merge_results/.qview.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mergesync/resources/queries/mergesync/merge_runs.query.xml b/mergesync/resources/queries/mergesync/merge_runs.query.xml deleted file mode 100644 index 1ab4b3e26..000000000 --- a/mergesync/resources/queries/mergesync/merge_runs.query.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - ldk.context - mergesync/mergeButtons.js - - MergeSync.buttons.resyncSelected(dataRegionName); - - -
-
-
-
diff --git a/mergesync/resources/queries/mergesync/merge_runs/.qview.xml b/mergesync/resources/queries/mergesync/merge_runs/.qview.xml deleted file mode 100644 index 717fe81fa..000000000 --- a/mergesync/resources/queries/mergesync/merge_runs/.qview.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mergesync/resources/queries/mergesync/orderssynced.query.xml b/mergesync/resources/queries/mergesync/orderssynced.query.xml deleted file mode 100644 index 79c6a7b17..000000000 --- a/mergesync/resources/queries/mergesync/orderssynced.query.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - study - clinpathRuns - objectid - - - - - ehr - tasks - taskid - - - - - ehr - requests - requestid - - - -
-
-
-
diff --git a/mergesync/resources/queries/mergesync/orderssynced/.qview.xml b/mergesync/resources/queries/mergesync/orderssynced/.qview.xml deleted file mode 100644 index f4f1570e5..000000000 --- a/mergesync/resources/queries/mergesync/orderssynced/.qview.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.00-0.01.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.00-0.01.sql deleted file mode 100644 index fbbb1e1b4..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.00-0.01.sql +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - --- Create schema, tables, indexes, and constraints used for MergeSync module here --- All SQL VIEW definitions should be created in mergesync-create.sql and dropped in mergesync-drop.sql -CREATE SCHEMA mergesync; - -CREATE TABLE mergesync.testnamemapping ( - rowid serial, - servicename varchar(100), - mergetestname varchar(100) -); - -CREATE TABLE mergesync.orderssynced ( - rowid serial, - objectid varchar(100), - merge_accession varchar(100), - container entityid, - created timestamp, - createdby int, - resultsreceived boolean -); - -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Albumin', 'ALB'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Amylase', 'AMYL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Anaerobic Culture', 'ANCULT'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Antibiotic Sensitivity', 'SENSI'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('BAL Fluid Analysis with Cytology', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('BASIC Chemistry Panel in-house', 'BASIC'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Bile Acids Post-prarandial', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Bile Acids Pre-prarandial', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('C-Reactive Protein', 'CRP'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CBC only, no differential', 'CBC'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CBC with automated differential', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CBC with manual differential', 'DIFF'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Chemistry panel with high density lipoprotein send out', 'CMPHDL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Clotting panel', 'CLOTPL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Comprehensive Chemistry panel in-house', 'COMP'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Comprehensive Chemistry Panel Send Out', 'CMP'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Compromised SPF Surveillance', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CSF analysis (WBC count & differential)', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CSF Glucose', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CSF Total Protein', 'CSF'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Cytology Send out', 'CYTO'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Dermatophyte test medium culture', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('ESPF Surveillance - Monthly', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('ESPF Surveillance - Quarterly', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Exam for Yeast', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Fecal culture', 'F_CULT'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Fecal parasite exam', 'F_PARA'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Filovirus', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Fungus Culture', 'FUNGAL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('General culture', 'G-CULT'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Glycosolated hemoglobin (HGBA1C)', 'HGBA1C'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Gram Stain', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('HDL', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B Post-Exposure Baseline Serology', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B Post-Exposure Baseline Virology', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B Post-Exposure Follow-Up Serology', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B Status Confirmation', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('High-density lipoprotein & Low-density lipoprotein (HDL & LDL)', 'HDLLDL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Intuitive Basic Array', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Intuitive Expanded Array', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Japanese Macaque Surveillance', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('LDL', 'LDL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Lipase', 'Lipase'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Lipid panel in-house: Cholesterol, Triglyceride, HDL, LDL', 'LIPID'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Malaria Screen', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Miscellaneous in-house', 'MISIN'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Miscellaneous send out', 'MISOUT'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Occult Blood', 'OCCBLD'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Other Clinpath', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Other SPF Surveillance', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL ABSCN-5', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL ABSCN-8', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL PCR', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL SIV WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL SRV1 WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL SRV2 WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL SRV5 WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL STLV WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Phenobarbital', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Primagam for TB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Protein Electrophoresis-Total Protein', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('RBC Morphology', 'MORPH'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Reticulocyte count', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Specific Gravity', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('SPF Surveillance - Annual', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('SRV', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('SRV Virus Isolation', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Terminal Serum Surveillance', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Thyroid Panel', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Urinalysis', 'URINE'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Vitamin D (1,25 Dihydroxy)', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Vitamin D (250H)', 'VITD'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('WBC differential', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Yersinia culture', 'YERSNA'); diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.01-0.02.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.01-0.02.sql deleted file mode 100644 index c2038db6d..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.01-0.02.sql +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -ALTER TABLE mergesync.orderssynced DROP COLUMN merge_accession; -ALTER TABLE mergesync.orderssynced ADD order_accession integer; -ALTER TABLE mergesync.orderssynced ADD test_accession integer; -ALTER TABLE mergesync.orderssynced ADD taskid entityid; \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.02-0.03.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.02-0.03.sql deleted file mode 100644 index 2ea5d27ce..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.02-0.03.sql +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -ALTER TABLE mergesync.orderssynced DROP COLUMN rowid; -ALTER TABLE mergesync.orderssynced ADD runid entityid; -ALTER TABLE mergesync.orderssynced ADD merge_datecreated timestamp; -ALTER TABLE mergesync.orderssynced ADD merge_dateposted timestamp; -ALTER TABLE mergesync.orderssynced ALTER COLUMN objectid SET not null; - -ALTER TABLE mergesync.orderssynced ADD CONSTRAINT PK_orderssynced PRIMARY KEY (objectid); \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.03-0.04.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.03-0.04.sql deleted file mode 100644 index 8fb92366a..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.03-0.04.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -ALTER TABLE mergesync.orderssynced ADD requestid entityid; \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.04-0.05.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.04-0.05.sql deleted file mode 100644 index ec986fce1..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.04-0.05.sql +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -CREATE TABLE mergesync.mergetolkmapping ( - mergetestname varchar(100), - servicename varchar(100), - automaticresults bool default false, - - CONSTRAINT PK_mergetolkmapping PRIMARY KEY (mergetestname) -); - -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('ALB', 'Albumin', true); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('AMYL', 'Amylase', true); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('ANCULT', 'Anaerobic Culture', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('BASIC', 'BASIC Chemistry Panel in-house', true); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CBC', 'CBC with automated differential', true); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CBCMIN', 'CBC only, no differential', true); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CLOTPL', 'Clotting panel', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CMP', 'Comprehensive Chemistry Panel Send Out', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CMPHDL', 'Chemistry panel with high density lipoprotein send out', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('COMP', 'Comprehensive Chemistry panel in-house', true); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CRP', 'C-Reactive Protein', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CSFCC', 'CSF analysis (WBC count & differential)', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CSFPRO', 'CSF Total Protein', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CSFTP', 'Cerebral Spinal Fluid Total Protein – Send out', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CSFWBC', 'Cerebral Spinal Fluid white blood count with differential', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CYTO', 'BAL Fluid Analysis with Cytology', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('DIFF', 'CBC with manual differential', false); ---INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('DIFF', 'WBC differential', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('DTMFUN', 'Dermatophyte test medium culture', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('F_CULT', 'Fecal culture', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('F_PARA', 'Fecal parasite exam', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('FUNGAL', 'Fungus Culture', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('GCULT1', 'General culture', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('GCULT2', 'General culture', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('GCULT3', 'General culture', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('HDLLDL', 'High-density lipoprotein & Low-density lipoprotein (HDL & LDL)', true); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('HGBA1C', 'Glycosolated hemoglobin (HGBA1C)', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('LDL', 'LDL', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('LIPID', 'Lipid panel in-house: Cholesterol, Triglyceride, HDL, LDL', true); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('MALA', 'Malaria Screen', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('MIS IN', 'Miscellaneous in-house', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('MISOUT', 'Bile Acids Post-prarandial', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('OCCBLD', 'Occult Blood', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('RETIC', 'Reticulocyte count', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('SENS2', 'Antibiotic Sensitivity', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('SENS3', 'Antibiotic Sensitivity', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('SENSI', 'Antibiotic Sensitivity', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('URINE', 'Urinalysis', false); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('YERSNA', 'Yersinia culture', false); diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.05-0.06.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.05-0.06.sql deleted file mode 100644 index 91416ab8f..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.05-0.06.sql +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -TRUNCATE TABLE mergesync.testnamemapping; -ALTER TABLE mergesync.testnamemapping DROP COLUMN rowid; -ALTER TABLE mergesync.testnamemapping ALTER COLUMN servicename SET NOT NULL; -ALTER TABLE mergesync.testnamemapping ADD CONSTRAINT PK_testnamemapping PRIMARY KEY (servicename); -ALTER TABLE mergesync.testnamemapping ADD automaticresults bool default false; - -DROP TABLE mergesync.mergetolkmapping; - -CREATE TABLE mergesync.mergetolkmapping ( - mergetestname varchar(100) NOT NULL, - servicename varchar(100), - - CONSTRAINT PK_mergetolkmapping PRIMARY KEY (mergetestname) -); - --- @SkipOnEmptySchemasBegin -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Albumin', 'ALB', true); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Amylase', 'AMYL', true); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Anaerobic Culture', 'ANCULT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('BASIC Chemistry Panel in-house', 'BASIC', true); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CBC with automated differential', 'CBC', true); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Clotting panel', 'CLOTPL', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Comprehensive Chemistry Panel Send Out', 'CMP', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Chemistry panel with high density lipoprotein send out', 'CMPHDL', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Comprehensive Chemistry panel in-house', 'COMP', true); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('C-Reactive Protein', 'CRP', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CSF analysis (WBC count & differential)', 'CSFCC', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CSF Total Protein', 'CSFPRO', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Cerebral Spinal Fluid Total Protein – Send out', 'CSFTP', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Cerebral Spinal Fluid white blood count with differential', 'CSFWBC', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('BAL Fluid Analysis with Cytology', 'CYTO', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Cytology Send out', 'CYTO', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CBC with manual differential', 'DIFF', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('WBC differential', 'DIFF', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Dermatophyte test medium culture', 'DTMFUN', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Fecal culture', 'F_CULT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Fecal parasite exam', 'F_PARA', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Fungus Culture', 'FUNGAL', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('General culture', 'GCULT1', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('High-density lipoprotein & Low-density lipoprotein (HDL & LDL)', 'HDLLDL', true); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Glycosolated hemoglobin (HGBA1C)', 'HGBA1C', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('LDL', 'LDL', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Lipid panel in-house: Cholesterol, Triglyceride, HDL, LDL', 'LIPID', true); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Malaria Screen', 'MALA', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Miscellaneous in-house', 'MIS IN', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Bile Acids Post-prarandial', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Bile Acids Pre-prarandial', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Calcium, ionized', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Calcium, total', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CSF Glucose', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Lipase', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Miscellaneous send out', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Phenobarbital', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Protein Electrophoresis-Total Protein', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Thyroid Panel', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Vitamin D (1,25 Dihydroxy)', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Vitamin D (250H)', 'MISOUT', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('RBC Morphology', 'MORPH', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Occult Blood', 'OCCBLD', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Reticulocyte count', 'RETIC', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Antibiotic Sensitivity', 'SENSI', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Urinalysis', 'URINE', false); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Yersinia culture', 'YERSNA', false); - -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('ALB', 'Albumin'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('AMYL', 'Amylase'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('ANCULT', 'Anaerobic Culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('BASIC', 'BASIC Chemistry Panel in-house'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CBC', 'CBC with automated differential'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CLOTPL', 'Clotting panel'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CMP', 'Comprehensive Chemistry Panel Send Out'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CMPHDL', 'Chemistry panel with high density lipoprotein send out'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('COMP', 'Comprehensive Chemistry panel in-house'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CRP', 'C-Reactive Protein'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CSFCC', 'CSF analysis (WBC count & differential)'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CSFPRO', 'CSF Total Protein'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CSFTP', 'Cerebral Spinal Fluid Total Protein – Send out'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CSFWBC', 'Cerebral Spinal Fluid white blood count with differential'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CYTO', 'BAL Fluid Analysis with Cytology'); ---INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CYTO', 'Cytology Send out'); ---INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('DIFF', 'CBC with manual differential'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('DIFF', 'WBC differential'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('DTMFUN', 'Dermatophyte test medium culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('F_CULT', 'Fecal culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('F_PARA', 'Fecal parasite exam'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('FUNGAL', 'Fungus Culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('GCULT1', 'General culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('GCULT2', 'General culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('GCULT3', 'General culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('HDLLDL', 'High-density lipoprotein & Low-density lipoprotein (HDL & LDL)'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('HGBA1C', 'Glycosolated hemoglobin (HGBA1C)'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('LDL', 'LDL'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('LIPID', 'Lipid panel in-house: Cholesterol, Triglyceride, HDL, LDL'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('MALA', 'Malaria Screen'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('MIS IN', 'Miscellaneous in-house'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('MISOUT', 'Miscellaneous send out'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('MORPH', 'RBC Morphology'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('OCCBLD', 'Occult Blood'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('RETIC', 'Reticulocyte count'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENS2', 'Antibiotic Sensitivity'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENS3', 'Antibiotic Sensitivity'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENSI', 'Antibiotic Sensitivity'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('URINE', 'Urinalysis'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('YERSNA', 'Yersinia culture'); --- @SkipOnEmptySchemasEnd diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.06-0.07.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.06-0.07.sql deleted file mode 100644 index dd03b5211..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.06-0.07.sql +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -UPDATE mergesync.testnamemapping SET automaticresults = true WHERE servicename = 'WBC differential'; -UPDATE mergesync.testnamemapping SET automaticresults = true WHERE servicename = 'RBC Morphology'; -UPDATE mergesync.testnamemapping SET automaticresults = true WHERE servicename = 'Reticulocyte count'; \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.07-0.08.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.07-0.08.sql deleted file mode 100644 index 0d9eaf62c..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.07-0.08.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -DELETE FROM mergesync.testnamemapping WHERE servicename = 'CBC with manual differential'; \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.08-0.09.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.08-0.09.sql deleted file mode 100644 index 0697fb386..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.08-0.09.sql +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - --- @SkipOnEmptySchemasBegin -DELETE FROM mergesync.mergetolkmapping WHERE mergetestname = 'SENSI2'; -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENSI2', 'Antibiotic Sensitivity'); - -DELETE FROM mergesync.mergetolkmapping WHERE mergetestname = 'SENSI3'; -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENSI3', 'Antibiotic Sensitivity'); --- @SkipOnEmptySchemasEnd diff --git a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.10-0.11.sql b/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.10-0.11.sql deleted file mode 100644 index 0ae81e704..000000000 --- a/mergesync/resources/schemas/dbscripts/postgresql/mergesync-0.10-0.11.sql +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -ALTER TABLE mergesync.mergetolkmapping DROP COLUMN deletedate; -ALTER TABLE mergesync.orderssynced ADD deletedate TIMESTAMP; diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.00-0.01.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.00-0.01.sql deleted file mode 100644 index fa7fb6754..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.00-0.01.sql +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - --- Create schema, tables, indexes, and constraints used for MergeSync module here --- All SQL VIEW definitions should be created in mergesync-create.sql and dropped in mergesync-drop.sql -CREATE SCHEMA mergesync; -GO - -CREATE TABLE mergesync.testnamemapping ( - rowid int identity(1,1), - servicename varchar(100), - mergetestname varchar(100) -); - -CREATE TABLE mergesync.orderssynced ( - rowid int identity(1,1), - objectid varchar(100), - merge_accession varchar(100), - container entityid, - created DATETIME, - createdby int, - resultsreceived bit -); - -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Albumin', 'ALB'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Amylase', 'AMYL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Anaerobic Culture', 'ANCULT'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Antibiotic Sensitivity', 'SENSI'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('BAL Fluid Analysis with Cytology', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('BASIC Chemistry Panel in-house', 'BASIC'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Bile Acids Post-prarandial', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Bile Acids Pre-prarandial', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('C-Reactive Protein', 'CRP'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CBC only, no differential', 'CBC'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CBC with automated differential', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CBC with manual differential', 'DIFF'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Chemistry panel with high density lipoprotein send out', 'CMPHDL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Clotting panel', 'CLOTPL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Comprehensive Chemistry panel in-house', 'COMP'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Comprehensive Chemistry Panel Send Out', 'CMP'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Compromised SPF Surveillance', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CSF analysis (WBC count & differential)', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CSF Glucose', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('CSF Total Protein', 'CSF'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Cytology Send out', 'CYTO'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Dermatophyte test medium culture', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('ESPF Surveillance - Monthly', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('ESPF Surveillance - Quarterly', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Exam for Yeast', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Fecal culture', 'F_CULT'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Fecal parasite exam', 'F_PARA'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Filovirus', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Fungus Culture', 'FUNGAL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('General culture', 'G-CULT'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Glycosolated hemoglobin (HGBA1C)', 'HGBA1C'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Gram Stain', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('HDL', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B Post-Exposure Baseline Serology', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B Post-Exposure Baseline Virology', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B Post-Exposure Follow-Up Serology', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Herpes B Status Confirmation', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('High-density lipoprotein & Low-density lipoprotein (HDL & LDL)', 'HDLLDL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Intuitive Basic Array', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Intuitive Expanded Array', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Japanese Macaque Surveillance', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('LDL', 'LDL'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Lipase', 'Lipase'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Lipid panel in-house: Cholesterol, Triglyceride, HDL, LDL', 'LIPID'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Malaria Screen', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Miscellaneous in-house', 'MISIN'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Miscellaneous send out', 'MISOUT'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Occult Blood', 'OCCBLD'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Other Clinpath', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Other SPF Surveillance', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL ABSCN-5', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL ABSCN-8', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL PCR', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL SIV WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL SRV1 WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL SRV2 WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL SRV5 WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('PDL STLV WB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Phenobarbital', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Primagam for TB', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Protein Electrophoresis-Total Protein', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('RBC Morphology', 'MORPH'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Reticulocyte count', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Specific Gravity', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('SPF Surveillance - Annual', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('SRV', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('SRV Virus Isolation', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Terminal Serum Surveillance', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Thyroid Panel', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Urinalysis', 'URINE'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Vitamin D (1,25 Dihydroxy)', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Vitamin D (250H)', 'VITD'); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('WBC differential', null); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname) VALUES ('Yersinia culture', 'YERSNA'); diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.01-0.02.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.01-0.02.sql deleted file mode 100644 index e182c146c..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.01-0.02.sql +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -ALTER TABLE mergesync.orderssynced DROP COLUMN merge_accession; -GO -ALTER TABLE mergesync.orderssynced ADD order_accession integer; -ALTER TABLE mergesync.orderssynced ADD test_accession integer; -ALTER TABLE mergesync.orderssynced ADD taskid entityid; \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.02-0.03.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.02-0.03.sql deleted file mode 100644 index fddf58cc0..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.02-0.03.sql +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -ALTER TABLE mergesync.orderssynced DROP COLUMN rowid; -ALTER TABLE mergesync.orderssynced ADD runid entityid; -ALTER TABLE mergesync.orderssynced ADD merge_datecreated DATETIME; -ALTER TABLE mergesync.orderssynced ADD merge_dateposted DATETIME; -ALTER TABLE mergesync.orderssynced ALTER COLUMN objectid entityid not null; -GO -ALTER TABLE mergesync.orderssynced ADD CONSTRAINT PK_orderssynced PRIMARY KEY (objectid); \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.03-0.04.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.03-0.04.sql deleted file mode 100644 index 8fb92366a..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.03-0.04.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -ALTER TABLE mergesync.orderssynced ADD requestid entityid; \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.04-0.05.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.04-0.05.sql deleted file mode 100644 index c4d266b7b..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.04-0.05.sql +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -CREATE TABLE mergesync.mergetolkmapping ( - mergetestname varchar(100), - servicename varchar(100), - automaticresults bit default 0, - - CONSTRAINT PK_mergetolkmapping PRIMARY KEY (mergetestname) -); - - -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('ALB', 'Albumin', 1); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('AMYL', 'Amylase', 1); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('ANCULT', 'Anaerobic Culture', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('BASIC', 'BASIC Chemistry Panel in-house', 1); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CBC', 'CBC with automated differential', 1); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CBCMIN', 'CBC only, no differential', 1); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CLOTPL', 'Clotting panel', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CMP', 'Comprehensive Chemistry Panel Send Out', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CMPHDL', 'Chemistry panel with high density lipoprotein send out', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('COMP', 'Comprehensive Chemistry panel in-house', 1); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CRP', 'C-Reactive Protein', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CSFCC', 'CSF analysis (WBC count & differential)', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CSFPRO', 'CSF Total Protein', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CSFTP', 'Cerebral Spinal Fluid Total Protein – Send out', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CSFWBC', 'Cerebral Spinal Fluid white blood count with differential', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('CYTO', 'BAL Fluid Analysis with Cytology', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('DIFF', 'CBC with manual differential', 0); ---INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('DIFF', 'WBC differential', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('DTMFUN', 'Dermatophyte test medium culture', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('F_CULT', 'Fecal culture', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('F_PARA', 'Fecal parasite exam', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('FUNGAL', 'Fungus Culture', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('GCULT1', 'General culture', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('GCULT2', 'General culture', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('GCULT3', 'General culture', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('HDLLDL', 'High-density lipoprotein & Low-density lipoprotein (HDL & LDL)', 1); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('HGBA1C', 'Glycosolated hemoglobin (HGBA1C)', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('LDL', 'LDL', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('LIPID', 'Lipid panel in-house: Cholesterol, Triglyceride, HDL, LDL', 1); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('MALA', 'Malaria Screen', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('MIS IN', 'Miscellaneous in-house', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('MISOUT', 'Bile Acids Post-prarandial', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('OCCBLD', 'Occult Blood', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('RETIC', 'Reticulocyte count', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('SENS2', 'Antibiotic Sensitivity', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('SENS3', 'Antibiotic Sensitivity', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('SENSI', 'Antibiotic Sensitivity', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('URINE', 'Urinalysis', 0); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename, automaticresults) VALUES ('YERSNA', 'Yersinia culture', 0); diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.05-0.06.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.05-0.06.sql deleted file mode 100644 index 7e660a19e..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.05-0.06.sql +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -TRUNCATE TABLE mergesync.testnamemapping; -ALTER TABLE mergesync.testnamemapping DROP COLUMN rowid; -ALTER TABLE mergesync.testnamemapping ALTER COLUMN servicename varchar(100) NOT NULL; -GO -ALTER TABLE mergesync.testnamemapping ADD CONSTRAINT PK_testnamemapping PRIMARY KEY (servicename); -GO -ALTER TABLE mergesync.testnamemapping ADD automaticresults bit default 0; -GO - -DROP TABLE mergesync.mergetolkmapping; -GO -CREATE TABLE mergesync.mergetolkmapping ( - mergetestname varchar(100) NOT NULL, - servicename varchar(100), - - CONSTRAINT PK_mergetolkmapping PRIMARY KEY (mergetestname) -); - -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Albumin', 'ALB', 1); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Amylase', 'AMYL', 1); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Anaerobic Culture', 'ANCULT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('BASIC Chemistry Panel in-house', 'BASIC', 1); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CBC with automated differential', 'CBC', 1); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Clotting panel', 'CLOTPL', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Comprehensive Chemistry Panel Send Out', 'CMP', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Chemistry panel with high density lipoprotein send out', 'CMPHDL', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Comprehensive Chemistry panel in-house', 'COMP', 1); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('C-Reactive Protein', 'CRP', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CSF analysis (WBC count & differential)', 'CSFCC', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CSF Total Protein', 'CSFPRO', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Cerebral Spinal Fluid Total Protein – Send out', 'CSFTP', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Cerebral Spinal Fluid white blood count with differential', 'CSFWBC', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('BAL Fluid Analysis with Cytology', 'CYTO', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Cytology Send out', 'CYTO', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CBC with manual differential', 'DIFF', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('WBC differential', 'DIFF', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Dermatophyte test medium culture', 'DTMFUN', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Fecal culture', 'F_CULT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Fecal parasite exam', 'F_PARA', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Fungus Culture', 'FUNGAL', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('General culture', 'GCULT1', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('High-density lipoprotein & Low-density lipoprotein (HDL & LDL)', 'HDLLDL', 1); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Glycosolated hemoglobin (HGBA1C)', 'HGBA1C', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('LDL', 'LDL', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Lipid panel in-house: Cholesterol, Triglyceride, HDL, LDL', 'LIPID', 1); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Malaria Screen', 'MALA', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Miscellaneous in-house', 'MIS IN', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Bile Acids Post-prarandial', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Bile Acids Pre-prarandial', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Calcium, ionized', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Calcium, total', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('CSF Glucose', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Lipase', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Miscellaneous send out', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Phenobarbital', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Protein Electrophoresis-Total Protein', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Thyroid Panel', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Vitamin D (1,25 Dihydroxy)', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Vitamin D (250H)', 'MISOUT', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('RBC Morphology', 'MORPH', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Occult Blood', 'OCCBLD', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Reticulocyte count', 'RETIC', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Antibiotic Sensitivity', 'SENSI', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Urinalysis', 'URINE', 0); -INSERT INTO mergesync.testnamemapping (servicename, mergetestname, automaticresults) VALUES ('Yersinia culture', 'YERSNA', 0); - -TRUNCATE TABLE mergesync.mergetolkmapping; -TRUNCATE TABLE mergesync.mergetolkmapping; -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('ALB', 'Albumin'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('AMYL', 'Amylase'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('ANCULT', 'Anaerobic Culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('BASIC', 'BASIC Chemistry Panel in-house'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CBC', 'CBC with automated differential'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CLOTPL', 'Clotting panel'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CMP', 'Comprehensive Chemistry Panel Send Out'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CMPHDL', 'Chemistry panel with high density lipoprotein send out'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('COMP', 'Comprehensive Chemistry panel in-house'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CRP', 'C-Reactive Protein'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CSFCC', 'CSF analysis (WBC count & differential)'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CSFPRO', 'CSF Total Protein'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CSFTP', 'Cerebral Spinal Fluid Total Protein – Send out'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CSFWBC', 'Cerebral Spinal Fluid white blood count with differential'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CYTO', 'BAL Fluid Analysis with Cytology'); ---INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('CYTO', 'Cytology Send out'); ---INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('DIFF', 'CBC with manual differential'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('DIFF', 'WBC differential'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('DTMFUN', 'Dermatophyte test medium culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('F_CULT', 'Fecal culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('F_PARA', 'Fecal parasite exam'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('FUNGAL', 'Fungus Culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('GCULT1', 'General culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('GCULT2', 'General culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('GCULT3', 'General culture'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('HDLLDL', 'High-density lipoprotein & Low-density lipoprotein (HDL & LDL)'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('HGBA1C', 'Glycosolated hemoglobin (HGBA1C)'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('LDL', 'LDL'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('LIPID', 'Lipid panel in-house: Cholesterol, Triglyceride, HDL, LDL'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('MALA', 'Malaria Screen'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('MIS IN', 'Miscellaneous in-house'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('MISOUT', 'Miscellaneous send out'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('MORPH', 'RBC Morphology'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('OCCBLD', 'Occult Blood'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('RETIC', 'Reticulocyte count'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENS2', 'Antibiotic Sensitivity'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENS3', 'Antibiotic Sensitivity'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENSI', 'Antibiotic Sensitivity'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('URINE', 'Urinalysis'); -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('YERSNA', 'Yersinia culture'); diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.06-0.07.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.06-0.07.sql deleted file mode 100644 index 145b13204..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.06-0.07.sql +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -UPDATE mergesync.testnamemapping SET automaticresults = 1 WHERE servicename = 'WBC differential'; -UPDATE mergesync.testnamemapping SET automaticresults = 1 WHERE servicename = 'RBC Morphology'; -UPDATE mergesync.testnamemapping SET automaticresults = 1 WHERE servicename = 'Reticulocyte count'; diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.07-0.08.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.07-0.08.sql deleted file mode 100644 index 0d9eaf62c..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.07-0.08.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -DELETE FROM mergesync.testnamemapping WHERE servicename = 'CBC with manual differential'; \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.08-0.09.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.08-0.09.sql deleted file mode 100644 index c290aaf47..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.08-0.09.sql +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -DELETE FROM mergesync.mergetolkmapping WHERE mergetestname = 'SENSI2'; -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENSI2', 'Antibiotic Sensitivity'); - -DELETE FROM mergesync.mergetolkmapping WHERE mergetestname = 'SENSI3'; -INSERT INTO mergesync.mergetolkmapping (mergetestname, servicename) VALUES ('SENSI3', 'Antibiotic Sensitivity'); \ No newline at end of file diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.09-0.10.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.09-0.10.sql deleted file mode 100644 index 25d65f4c2..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.09-0.10.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -ALTER TABLE mergesync.mergetolkmapping ADD deletedate DATETIME; diff --git a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.10-0.11.sql b/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.10-0.11.sql deleted file mode 100644 index 277145e95..000000000 --- a/mergesync/resources/schemas/dbscripts/sqlserver/mergesync-0.10-0.11.sql +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -ALTER TABLE mergesync.mergetolkmapping DROP COLUMN deletedate; -ALTER TABLE mergesync.orderssynced ADD deletedate DATETIME; diff --git a/mergesync/resources/schemas/mergesync.xml b/mergesync/resources/schemas/mergesync.xml deleted file mode 100644 index 232df34e6..000000000 --- a/mergesync/resources/schemas/mergesync.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - LabKey to Merge Service/Panel Name Mapping - - - Service Name - true - - - Merge Test Name - - - Expect Results From Merge? - - -
- - - Merge to LabKey Service/Panel Name Mapping - - - Merge Test Name - - - Service Name - - -
- - - Orders Synced To/From Merge - - - Clinpath Runs Record - - - Request Id - - - Task Id - - - Key - - - Merge Order Accession # - - - Merge Test Accession # - - - Merge Date Created - - - Merge Date Posted - - - Date Deleted In LabKey - - - Folder - - - - - - - - - Results Received? - - -
-
\ No newline at end of file diff --git a/mergesync/resources/scripts/mergesync/mergesync.js b/mergesync/resources/scripts/mergesync/mergesync.js deleted file mode 100644 index 6fd35af74..000000000 --- a/mergesync/resources/scripts/mergesync/mergesync.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2014-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -var console = require("console"); -var LABKEY = require("labkey"); - -exports.init = function(EHR){ - EHR.Server.TriggerManager.registerHandlerForQuery(EHR.Server.TriggerManager.Events.COMPLETE, 'study', 'clinpathruns', function(event, errors, helper){ - var rows = helper.getRows(); - if (helper.getEvent() == 'insert' && rows.length && !helper.isValidateOnly()){ - var toSync = []; - for (var i=0;i - -Ext4.onReady(function (){ - - if (LABKEY.Security.currentUser.isAdmin){ - var webpart = <%=webpartContext%>; - - Ext4.define('ETLPanel', { - extend: 'Ext.form.Panel', - initComponent: function(){ - Ext4.apply(this, { - border: false, - items: [{ - html: 'Loading...' - }], - buttons: [{ - text: 'Submit', - handler: this.onSubmit - },{ - text: 'Pull From Merge Now', - itemId: 'runEtlBtn', - disabled: true, - handler: function(btn){ - LABKEY.Ajax.request({ - url: LABKEY.ActionURL.buildURL('mergeSync', 'pullFromMerge', null), - method : 'POST', - scope: this, - failure: LDK.Utils.getErrorCallback({ - showAlertOnError: true - }) - }); - Ext4.Msg.alert('Request Sent', 'A request has been sent to pull data from merge'); - } - }] - }); - - this.loadData(); - this.callParent(); - }, - - loadData: function(){ - LABKEY.Ajax.request({ - url: LABKEY.ActionURL.buildURL('mergeSync', 'getEtlDetails', null), - method : 'GET', - scope: this, - failure: LDK.Utils.getErrorCallback(), - success: this.onLoad - }); - }, - - onLoad: function(results){ - var json = LDK.Utils.decodeHttpResponseJson(results); - var labelWidth = 180; - var width = 550; - - var toAdd = []; - toAdd.push({ - xtype: 'checkbox', - fieldLabel: 'Pull Enabled', - labelWidth: labelWidth, - width: width, - itemId: 'pullEnabled', - checked: json.pullEnabled - }); - - toAdd.push({ - xtype: 'checkbox', - fieldLabel: 'Push Enabled', - labelWidth: labelWidth, - width: width, - itemId: 'pushEnabled', - checked: json.pushEnabled - }); - - toAdd.push({ - xtype: 'checkbox', - fieldLabel: 'Sync Animals and Projects', - labelWidth: labelWidth, - width: width, - itemId: 'syncAnimalsAndProjects', - checked: json.syncAnimalsAndProjects - }); - - toAdd.push({ - xtype: 'datefield', - fieldLabel: 'Min Date', - labelWidth: labelWidth, - width: width, - itemId: 'lastRun', - //format: 'Y-m-d h:i', - value: LDK.ConvertUtils.parseDate(json.lastRun) - }); - - toAdd.push({ - xtype: 'displayfield', - fieldLabel: 'Next Run', - labelWidth: labelWidth, - width: width, - value: json.nextRun - }); - - if (json.pullEnabled) - this.down('#runEtlBtn').setDisabled(false); - - Ext4.each(json.configKeys, function(key){ - toAdd.push({ - xtype: 'textfield', - labelWidth: labelWidth, - width: width, - itemId: key, - fieldLabel: key, - value: json.config[key] - }); - }, this); - - this.removeAll(); - this.add({ - title: 'ETL Settings', - xtype: 'form', - itemId: 'etlSettings', - bodyStyle: 'padding: 5px;', - items: toAdd - }); - }, - - onSubmit: function(btn){ - var form = btn.up('form'); - var settings = form.down('#etlSettings'); - var fields = settings.getForm().getFields(); - - var json = {}; - - fields.each(function(field){ - if (field.itemId) - json[field.itemId] = field.getValue(); - }, this); - - Ext4.Msg.wait('Saving...'); - LABKEY.Ajax.request({ - url: LABKEY.ActionURL.buildURL('mergeSync', 'setEtlDetails', null), - method : 'POST', - params: json, - scope: this, - failure: LDK.Utils.getErrorCallback(), - success: function(response){ - Ext4.Msg.hide(); - Ext4.Msg.alert('Success', 'Save Successful', function(){ - window.location.reload(); - }); - } - }); - } - }); - - Ext4.create('ETLPanel', {}).render('etl_div'); - } -}); - - - - -This page allows configuration of the Merge Sync. Below are explanations for the config properties: -

- -
    -
  • - labkeyUser: A valid LabKey user, which should have admin permission in the target folder. Only required if pull is enabled. -
  • -
  • - labkeyContainer: The containerPath where the data will be saved. Only required if pull is enabled. There can only be active container per site. -
  • -
  • - syncInterval: The sync frequency in minutes. -
  • -
  • - dataSourceName: The name of the data source, which should be defined in application.properties -
  • -
  • - schemaName: The name of the source schema in the merge DB. Most likely 'dbo' -
  • -
-

- Click here to view more detailed documentation on the Merge Sync process -

-
\ No newline at end of file diff --git a/mergesync/resources/views/begin.view.xml b/mergesync/resources/views/begin.view.xml deleted file mode 100644 index 60651d881..000000000 --- a/mergesync/resources/views/begin.view.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mergesync/resources/views/instructions.html b/mergesync/resources/views/instructions.html deleted file mode 100644 index 256da47a4..000000000 --- a/mergesync/resources/views/instructions.html +++ /dev/null @@ -1,63 +0,0 @@ - diff --git a/mergesync/resources/views/instructions.view.xml b/mergesync/resources/views/instructions.view.xml deleted file mode 100644 index 8b9f5cc95..000000000 --- a/mergesync/resources/views/instructions.view.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mergesync/resources/web/mergesync/mergeButtons.js b/mergesync/resources/web/mergesync/mergeButtons.js deleted file mode 100644 index 6abd2e145..000000000 --- a/mergesync/resources/web/mergesync/mergeButtons.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2014-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -Ext4.ns('MergeSync.buttons'); - -MergeSync.buttons = new function(){ - return { - resyncSelected: function(dataRegionName){ - var dataRegion = LABKEY.DataRegions[dataRegionName]; - var checked = dataRegion.getChecked(); - if (!checked || !checked.length){ - alert('No records selected'); - return; - } - - Ext4.Msg.wait('Loading...'); - LABKEY.Ajax.request({ - url: LABKEY.ActionURL.buildURL('mergesync', 'resyncRuns', null, {pks: checked}), - method: 'POST', - scope: this, - failure: LDK.Utils.getErrorCallback(), - success: function(){ - Ext4.Msg.hide(); - Ext4.Msg.alert('Success', 'Runs have been resynced'); - } - }); - } - } -}; \ No newline at end of file diff --git a/mergesync/src/org/labkey/mergesync/MergeSyncController.java b/mergesync/src/org/labkey/mergesync/MergeSyncController.java deleted file mode 100644 index 11f1c8565..000000000 --- a/mergesync/src/org/labkey/mergesync/MergeSyncController.java +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -package org.labkey.mergesync; - -import org.apache.commons.beanutils.ConversionException; -import org.labkey.api.action.ApiResponse; -import org.labkey.api.action.ApiSimpleResponse; -import org.labkey.api.action.MutatingApiAction; -import org.labkey.api.action.ReadOnlyApiAction; -import org.labkey.api.action.SpringActionController; -import org.labkey.api.data.ContainerManager; -import org.labkey.api.data.ConvertHelper; -import org.labkey.api.data.PropertyManager; -import org.labkey.api.data.PropertyManager.WritablePropertyMap; -import org.labkey.api.security.RequiresPermission; -import org.labkey.api.security.ValidEmail; -import org.labkey.api.security.permissions.AdminPermission; -import org.labkey.api.util.JobRunner; -import org.springframework.validation.BindException; -import org.springframework.validation.Errors; - -import java.sql.SQLException; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -public class MergeSyncController extends SpringActionController -{ - private static final DefaultActionResolver _actionResolver = new DefaultActionResolver(MergeSyncController.class); - public static final String NAME = "mergesync"; - - public MergeSyncController() - { - setActionResolver(_actionResolver); - } - - @RequiresPermission(AdminPermission.class) - public static class SetEtlDetailsAction extends MutatingApiAction - { - @Override - public ApiResponse execute(EtlAdminForm form, BindException errors) - { - Map resultProperties = new HashMap<>(); - - WritablePropertyMap configMap = PropertyManager.getWritableProperties(MergeSyncManager.CONFIG_PROPERTY_DOMAIN, true); - - configMap.put(MergeSyncManager.DATA_SOURCE_PROP_NAME, form.getDataSourceName()); - configMap.put(MergeSyncManager.SCHEMA_PROP_NAME, form.getSchemaName()); - configMap.put(MergeSyncManager.MERGE_USER_PROP_NAME, form.getMergeUserName()); - if (form.getLastRun() != null) - { - try - { - Date lastRun = ConvertHelper.convert(form.getLastRun(), Date.class); - - configMap.put(MergeSyncManager.LAST_RUN_PROP_NAME, ((Long)lastRun.getTime()).toString()); - } - catch (ConversionException e) - { - errors.reject(ERROR_MSG, e.getMessage()); - return null; - } - } - configMap.put(MergeSyncManager.SYNC_INTERVAL_PROP_NAME, form.getSyncInterval() == null ? null : form.getSyncInterval().toString()); - - if (form.getLabkeyUser() != null) - { - try - { - new ValidEmail(form.getLabkeyUser()); - } - catch (ValidEmail.InvalidEmailException e) - { - errors.reject(ERROR_MSG, "Invalid email: " + e.getMessage()); - return null; - } - - configMap.put(MergeSyncManager.LABKEY_USER_PROP_NAME, form.getLabkeyUser()); - } - - if (form.getLabkeyContainer() != null) - { - if (ContainerManager.getForPath(form.getLabkeyContainer()) == null) - { - errors.reject(ERROR_MSG, "Invalid container: " + form.getLabkeyContainer()); - return null; - } - - configMap.put(MergeSyncManager.LABKEY_CONTAINER_PROP_NAME, form.getLabkeyContainer()); - } - - if (form.getPullEnabled() != null) - configMap.put(MergeSyncManager.PULL_ENABLED_PROP_NAME, form.getPullEnabled().toString()); - - if (form.getPushEnabled() != null) - configMap.put(MergeSyncManager.PUSH_ENABLED_PROP_NAME, form.getPushEnabled().toString()); - - if (form.getSyncAnimalsAndProjects() != null) - configMap.put(MergeSyncManager.SYNC_ANIMALS_PROP_NAME, form.getSyncAnimalsAndProjects().toString()); - - configMap.save(); - - //if config was changed and the ETL is current scheduled to run, we need to restart it - MergeSyncManager.get().onSettingsChange(); - - resultProperties.put("success", true); - - return new ApiSimpleResponse(resultProperties); - } - } - - public static class EtlAdminForm - { - private Boolean _pullEnabled; - private Boolean _pushEnabled; - private Boolean _syncAnimalsAndProjects; - private String _dataSourceName; - private String _schemaName; - private String _labkeyUser; - private String _lastRun; - private String _labkeyContainer; - private Integer _syncInterval; - private String _mergeUserName; - - public String getDataSourceName() - { - return _dataSourceName; - } - - public void setDataSourceName(String dataSourceName) - { - _dataSourceName = dataSourceName; - } - - public String getSchemaName() - { - return _schemaName; - } - - public void setSchemaName(String schemaName) - { - _schemaName = schemaName; - } - - public Boolean getPullEnabled() - { - return _pullEnabled; - } - - public void setPullEnabled(Boolean pullEnabled) - { - _pullEnabled = pullEnabled; - } - - public Boolean getPushEnabled() - { - return _pushEnabled; - } - - public void setPushEnabled(Boolean pushEnabled) - { - _pushEnabled = pushEnabled; - } - - public Boolean getSyncAnimalsAndProjects() - { - return _syncAnimalsAndProjects; - } - - public void setSyncAnimalsAndProjects(Boolean syncAnimalsAndProjects) - { - _syncAnimalsAndProjects = syncAnimalsAndProjects; - } - - public String getLabkeyUser() - { - return _labkeyUser; - } - - public void setLabkeyUser(String labkeyUser) - { - _labkeyUser = labkeyUser; - } - - public String getLabkeyContainer() - { - return _labkeyContainer; - } - - public void setLabkeyContainer(String labkeyContainer) - { - _labkeyContainer = labkeyContainer; - } - - public Integer getSyncInterval() - { - return _syncInterval; - } - - public void setSyncInterval(Integer syncInterval) - { - _syncInterval = syncInterval; - } - - public String getLastRun() - { - return _lastRun; - } - - public void setLastRun(String lastRun) - { - _lastRun = lastRun; - } - - public String getMergeUserName() - { - return _mergeUserName; - } - - public void setMergeUserName(String mergeUserName) - { - _mergeUserName = mergeUserName; - } - } - - @RequiresPermission(AdminPermission.class) - public static class GetEtlDetailsAction extends ReadOnlyApiAction - { - @Override - public ApiResponse execute(Object form, BindException errors) - { - Map resultProperties = new HashMap<>(); - resultProperties.put("pullEnabled", MergeSyncManager.get().isPullEnabled()); - resultProperties.put("pushEnabled", MergeSyncManager.get().isPushEnabled()); - resultProperties.put("lastRun", MergeSyncManager.get().getLastRun()); - resultProperties.put("nextRun", MergeSyncManager.get().getNextRun()); - resultProperties.put("syncAnimalsAndProjects", MergeSyncManager.get().doSyncAnimalsAndProjects()); - - String[] etlConfigKeys = {MergeSyncManager.DATA_SOURCE_PROP_NAME, MergeSyncManager.SCHEMA_PROP_NAME, MergeSyncManager.LABKEY_CONTAINER_PROP_NAME, MergeSyncManager.LABKEY_USER_PROP_NAME, MergeSyncManager.SYNC_INTERVAL_PROP_NAME, MergeSyncManager.MERGE_USER_PROP_NAME}; - - resultProperties.put("configKeys", etlConfigKeys); - resultProperties.put("config", PropertyManager.getProperties(MergeSyncManager.CONFIG_PROPERTY_DOMAIN)); - - return new ApiSimpleResponse(resultProperties); - } - } - - @RequiresPermission(AdminPermission.class) - public static class PullFromMergeAction extends MutatingApiAction - { - @Override - public ApiResponse execute(Object form, BindException errors) - { - try - { - JobRunner.getDefault().execute(() -> new MergeSyncRunner().pullResultsFromMerge()); - } - catch (Exception e) - { - errors.reject(ERROR_MSG, e.getMessage()); - return null; - } - - return new ApiSimpleResponse("success", true); - } - - @Override - public void validateForm(Object form, Errors errors) - { - try - { - MergeSyncManager.get().validateSettings(); - } - catch (Exception e) - { - errors.reject(ERROR_MSG, e.getMessage()); - } - } - } - - @RequiresPermission(AdminPermission.class) - public static class ResyncRunsAction extends MutatingApiAction - { - @Override - public ApiResponse execute(ResyncRunsForm form, BindException errors) - { - if (form.getPks() == null || form.getPks().length == 0) - { - errors.reject(ERROR_MSG, "Must supply a list of PKs to sync"); - return null; - } - - MergeSyncRunner runner = new MergeSyncRunner(); - try - { - for (String pk : form.getPks()) - { - String[] tokens = pk.split("<>"); - if (tokens.length != 2 || tokens[0] == null || tokens[1] == null) - { - errors.reject(ERROR_MSG, "Invalid PK: " + pk); - return null; - } - else - { - Integer accession = Integer.parseInt(tokens[0]); - Integer testId = Integer.parseInt(tokens[1]); - runner.syncSingleRun(getContainer(), getUser(), accession, testId); - } - } - } - catch (SQLException | RuntimeException e) - { - errors.reject(ERROR_MSG, e.getMessage()); - return null; - } - - return new ApiSimpleResponse("success", true); - } - } - - public static class ResyncRunsForm - { - private String[] _pks; - - public String[] getPks() - { - return _pks; - } - - public void setPks(String[] pks) - { - _pks = pks; - } - } -} \ No newline at end of file diff --git a/mergesync/src/org/labkey/mergesync/MergeSyncManager.java b/mergesync/src/org/labkey/mergesync/MergeSyncManager.java deleted file mode 100644 index e4904067d..000000000 --- a/mergesync/src/org/labkey/mergesync/MergeSyncManager.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -package org.labkey.mergesync; - -import org.apache.commons.lang3.time.DateUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.labkey.api.data.Container; -import org.labkey.api.data.ContainerManager; -import org.labkey.api.data.DbSchema; -import org.labkey.api.data.DbSchemaType; -import org.labkey.api.data.DbScope; -import org.labkey.api.data.PropertyManager; -import org.labkey.api.data.PropertyManager.WritablePropertyMap; -import org.labkey.api.security.User; -import org.labkey.api.security.UserManager; -import org.labkey.api.security.ValidEmail; -import org.labkey.api.util.JobRunner; -import org.quartz.JobBuilder; -import org.quartz.JobDetail; -import org.quartz.SimpleScheduleBuilder; -import org.quartz.Trigger; -import org.quartz.TriggerBuilder; -import org.quartz.impl.StdSchedulerFactory; - -import java.util.Calendar; -import java.util.Date; - -public class MergeSyncManager -{ - private static final MergeSyncManager _instance = new MergeSyncManager(); - private JobDetail _job = null; - private Trigger _trigger = null; - - public static final String TABLE_TESTNAMEMAPPING = "testnamemapping"; - public static final String TABLE_MERGE_TO_LK_MAPPING = "mergetolkmapping"; - public static final String TABLE_ORDERSSYNCED = "orderssynced"; - - public static final String TABLE_MERGE_ORDERS = "orders"; - public static final String TABLE_MERGE_RESULTS = "results"; - public static final String TABLE_MERGE_TEST = "tests"; - public static final String TABLE_MERGE_TESTINFO = "testinfo"; - public static final String TABLE_MERGE_CONTAINERS = "containers"; - public static final String TABLE_MERGE_VISITS = "visits"; - public static final String TABLE_MERGE_COPY_TO = "copyto"; - public static final String TABLE_MERGE_VISIT_INS = "vis_ins"; - public static final String TABLE_MERGE_INSURANCE = "insurance"; - public static final String TABLE_MERGE_PERSONNEL = "prsnl"; - public static final String TABLE_MERGE_PATIENTS = "patients"; - - private MergeSyncManager() - { - - } - - public static MergeSyncManager get() - { - return _instance; - } - - private static final Logger _log = LogManager.getLogger(MergeSyncManager.class); - private Integer _syncInterval; - - public static final String DATA_SOURCE_PROP_NAME = "dataSourceName"; - public static final String SCHEMA_PROP_NAME = "schemaName"; - - public static final String LABKEY_USER_PROP_NAME = "labkeyUser"; - public static final String LABKEY_CONTAINER_PROP_NAME = "labkeyContainer"; - public static final String SYNC_INTERVAL_PROP_NAME = "syncInterval"; - - public static final String PULL_ENABLED_PROP_NAME = "pullEnabled"; - public static final String PUSH_ENABLED_PROP_NAME = "pushEnabled"; - public static final String SYNC_ANIMALS_PROP_NAME = "syncAnimalsAndProjects"; - public static final String LAST_RUN_PROP_NAME = "lastRun"; - public static final String MERGE_USER_PROP_NAME = "mergeUserName"; - - public static final String CONFIG_PROPERTY_DOMAIN = "org.labkey.mergesync.etl.config"; - - public synchronized void schedule() - { - if (!isEnabled()) - return; - - try - { - validateSettings(); - _syncInterval = getSyncInterval(); - - if (_syncInterval <= 0) - { - _log.error("Merge sync has an invalid frequency, will not schedule: {}", _syncInterval); - return; - } - - if (_job == null) - { - _job = JobBuilder.newJob(MergeSyncRunner.class) - .withIdentity(MergeSyncRunner.class.getCanonicalName(), MergeSyncRunner.class.getCanonicalName()) - .usingJobData("mergeSync", MergeSyncRunner.class.getName()) - .build(); - } - - _trigger = TriggerBuilder.newTrigger() - .withIdentity(MergeSyncRunner.class.getCanonicalName(), MergeSyncRunner.class.getCanonicalName()) - .withSchedule(SimpleScheduleBuilder.repeatMinutelyForever(_syncInterval)) - .forJob(_job) - .build(); - - StdSchedulerFactory.getDefaultScheduler().scheduleJob(_job, _trigger); - - _log.info("Merge sync scheduled to run every {} minutes", getSyncInterval()); - } - catch (IllegalArgumentException e) - { - _log.error("Merge sync is enabled, but the saved setting are invalid. Sync will not start.", e); - return; - } - catch (Exception e) - { - _log.error("Error scheduling Merge sync", e); - } - } - - public synchronized void unschedule() - { - if (_job != null) - { - try - { - StdSchedulerFactory.getDefaultScheduler().deleteJob(_job.getKey()); - _trigger = null; - _log.info("Merge sync unscheduled"); - } - catch (Exception e) - { - _log.error("Error unscheduling Merge sync", e); - } - } - } - - public void onSettingsChange() - { - if (!isEnabled()) - { - if (_job != null) - unschedule(); - } - else - { - try - { - validateSettings(); - - if (_job == null) - { - schedule(); - } - else - { - if (!_syncInterval.equals(getSyncInterval())) - { - _log.info("Rescheduling Merge Sync due to change in settings"); - unschedule(); - schedule(); - } - - //this indicates it is already scheduled with the correct frequency - } - } - catch (Exception e) - { - //ignore - } - } - } - - public Date getNextRun() - { - if (_trigger == null) - return null; - - return _trigger.getFireTimeAfter(new Date()); - } - - public Date getLastRun() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(LAST_RUN_PROP_NAME); - if (prop == null) - return null; - - Long value = Long.parseLong(prop); - if (value == null) - { - return null; - } - - return new Date(value); - } - - public void setLastRun(Date date) - { - WritablePropertyMap pm = PropertyManager.getWritableProperties(CONFIG_PROPERTY_DOMAIN, true); - date = DateUtils.truncate(date, Calendar.MINUTE); //always round to nearest minute - pm.put(LAST_RUN_PROP_NAME, String.valueOf(date.getTime())); - pm.save(); - } - - public void init() - { - if (isEnabled() && _trigger == null) - { - _log.info("scheduling Merge sync"); - JobRunner.getDefault().execute(new Runnable(){ - @Override - public void run() - { - schedule(); - } - }, 60000); - } - } - - public String getDataSourceName() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(DATA_SOURCE_PROP_NAME); - if (prop == null) - return null; - - return prop; - } - - public String getSchemaName() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(SCHEMA_PROP_NAME); - if (prop == null) - return null; - - return prop; - } - - public User getLabKeyUser() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(LABKEY_USER_PROP_NAME); - if (prop == null) - return null; - - try - { - ValidEmail email = new ValidEmail(prop); - return UserManager.getUser(email); - } - catch (ValidEmail.InvalidEmailException e) - { - _log.error("Invalid email saved for Merge Sync: {}", e.getMessage()); - } - - return null; - } - - public Container getLabKeyContainer() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(LABKEY_CONTAINER_PROP_NAME); - if (prop == null) - return null; - - return ContainerManager.getForPath(prop); - } - - public int getSyncInterval() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(SYNC_INTERVAL_PROP_NAME); - if (prop == null) - return -1; - - Integer value = Integer.parseInt(prop); - if (value == null) - { - return -1; - } - - return value; - } - - public boolean isPullEnabled() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(PULL_ENABLED_PROP_NAME); - if (prop == null) - return false; - - Boolean value = Boolean.parseBoolean(prop); - if (value == null) - { - return false; - } - - return value; - } - - public boolean doSyncAnimalsAndProjects() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(SYNC_ANIMALS_PROP_NAME); - if (prop == null) - return false; - - Boolean value = Boolean.parseBoolean(prop); - if (value == null) - { - return false; - } - - return value; - } - - public boolean isPushEnabled() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(PUSH_ENABLED_PROP_NAME); - if (prop == null) - return false; - - Boolean value = Boolean.parseBoolean(prop); - if (value == null) - { - return false; - } - - return value; - } - - public String getMergeUserName() - { - return PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(MERGE_USER_PROP_NAME); - } - - private boolean isEnabled() - { - return isPullEnabled() || isPullEnabled(); - } - - public void validateSettings() throws IllegalArgumentException - { - if (isEnabled()) - { - if (getDataSourceName() == null) - throw new IllegalArgumentException("Must provide a data source name"); - - DbScope scope = DbScope.getDbScope(getDataSourceName()); - if (scope == null) - throw new IllegalArgumentException("Unknown data source: " + getDataSourceName()); - - DbSchema schema = scope.getSchema(getSchemaName(), DbSchemaType.Bare); - if (schema == null) - throw new IllegalArgumentException("Unknown schema: " + getSchemaName()); - } - - if (isPullEnabled()) - { - if (getLabKeyUser() == null) - throw new IllegalArgumentException("Unknown or invalid LabKey User"); - - if (PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(LABKEY_CONTAINER_PROP_NAME) == null) - throw new IllegalArgumentException("No LabKey container set"); - } - - if (isPushEnabled() || doSyncAnimalsAndProjects()) - { - if (getMergeUserName() == null) - throw new IllegalArgumentException("Must provide the name of the merge user to use for sync"); - } - } - - public DbSchema getMergeSchema() - { - DbScope scope = DbScope.getDbScope(MergeSyncManager.get().getDataSourceName()); - if (scope == null) - return null; - - return scope.getSchema(MergeSyncManager.get().getSchemaName(), DbSchemaType.Bare); - } -} \ No newline at end of file diff --git a/mergesync/src/org/labkey/mergesync/MergeSyncModule.java b/mergesync/src/org/labkey/mergesync/MergeSyncModule.java deleted file mode 100644 index fdf99f12f..000000000 --- a/mergesync/src/org/labkey/mergesync/MergeSyncModule.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -package org.labkey.mergesync; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.labkey.api.data.Container; -import org.labkey.api.data.ContainerManager; -import org.labkey.api.ehr.EHRService; -import org.labkey.api.ldk.ExtendedSimpleModule; -import org.labkey.api.module.ModuleContext; -import org.labkey.api.query.DetailsURL; -import org.labkey.api.resource.Resource; -import org.labkey.api.security.permissions.AdminPermission; -import org.labkey.api.settings.AdminConsole; -import org.labkey.api.view.WebPartFactory; - -import java.util.Collection; -import java.util.Collections; -import java.util.Set; - -public class MergeSyncModule extends ExtendedSimpleModule -{ - public static final String NAME = "MergeSync"; - - @Override - public String getName() - { - return NAME; - } - - @Override - public @Nullable Double getSchemaVersion() - { - return 0.11; - } - - @NotNull - @Override - protected Collection createWebPartFactories() - { - return Collections.emptyList(); - } - - @Override - protected void init() - { - addController(MergeSyncController.NAME, MergeSyncController.class); - } - - @Override - protected void doStartupAfterSpringConfig(ModuleContext moduleContext) - { - Resource r = getModuleResource("/scripts/mergesync/mergesync.js"); - assert r != null; - EHRService.get().registerTriggerScript(this, r); - DetailsURL details = DetailsURL.fromString("/mergeSync-begin.view", ContainerManager.getSharedContainer()); - AdminConsole.addLink(AdminConsole.SettingsLinkType.Management, "merge sync admin", details.getActionURL(), AdminPermission.class); - - MergeSyncManager.get().init(); - - EHRService.get().registerTableCustomizer(this, MergeSyncTableCustomizer.class); - } - - @NotNull - @Override - public Collection getSummary(Container c) - { - return Collections.emptyList(); - } - - @Override - @NotNull - public Set getSchemaNames() - { - return Collections.singleton(MergeSyncSchema.NAME); - } - - @Override - protected void registerSchemas() - { - MergeSyncUserSchema.register(this); - } -} \ No newline at end of file diff --git a/mergesync/src/org/labkey/mergesync/MergeSyncRunner.java b/mergesync/src/org/labkey/mergesync/MergeSyncRunner.java deleted file mode 100644 index 60b6d6d6b..000000000 --- a/mergesync/src/org/labkey/mergesync/MergeSyncRunner.java +++ /dev/null @@ -1,1286 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ -package org.labkey.mergesync; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.DateUtils; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; -import org.jetbrains.annotations.Nullable; -import org.labkey.api.cache.CacheManager; -import org.labkey.api.collections.CaseInsensitiveHashMap; -import org.labkey.api.data.ColumnInfo; -import org.labkey.api.data.CompareType; -import org.labkey.api.data.Container; -import org.labkey.api.data.ConvertHelper; -import org.labkey.api.data.DbSchema; -import org.labkey.api.data.DbSchemaType; -import org.labkey.api.data.DbScope; -import org.labkey.api.data.Results; -import org.labkey.api.data.ResultsImpl; -import org.labkey.api.data.SQLFragment; -import org.labkey.api.data.Selector; -import org.labkey.api.data.SimpleFilter; -import org.labkey.api.data.Sort; -import org.labkey.api.data.SqlExecutor; -import org.labkey.api.data.Table; -import org.labkey.api.data.TableInfo; -import org.labkey.api.data.TableSelector; -import org.labkey.api.ehr.EHRService; -import org.labkey.api.query.BatchValidationException; -import org.labkey.api.query.DuplicateKeyException; -import org.labkey.api.query.FieldKey; -import org.labkey.api.query.InvalidKeyException; -import org.labkey.api.query.QueryService; -import org.labkey.api.query.QueryUpdateServiceException; -import org.labkey.api.security.User; -import org.labkey.api.study.Dataset; -import org.labkey.api.study.StudyService; -import org.labkey.api.util.GUID; -import org.labkey.api.util.PageFlowUtil; -import org.labkey.api.view.ActionURL; -import org.labkey.api.view.ViewContext; -import org.quartz.Job; -import org.quartz.JobExecutionContext; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * User: bimber - * Date: 10/10/13 - * Time: 12:26 PM - */ -public class MergeSyncRunner implements Job -{ - private static final Logger _log = LogManager.getLogger(MergeSyncRunner.class); - protected final static SimpleDateFormat _dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm"); - protected final static SimpleDateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - private final Set EXCLUDED_RESULTS = PageFlowUtil.set("received", "recieved", ".", "SENT TO RHEIN CONSULTING LAB"); - - private final Map _cachedResultTables = new HashMap<>(); - private final Map _cachedProjectNames = new HashMap<>(); - private final Map _cachedTasks = new HashMap<>(); - private final Map> _cachedRuns = new HashMap<>(); - private final Map _cachedMethods = new HashMap<>(); - private final Map _cachedTissues = new HashMap<>(); - - public MergeSyncRunner() - { - - } - - /** - * pulls data from Merge back to EHR - */ - @Override - public void execute(JobExecutionContext context) - { - if (!MergeSyncManager.get().isPullEnabled()) - return; - - pullResultsFromMerge(); - } - - /** - * When a request is sent to merge, a record is added to mergesync.orderssynced - * This inspects any records in this table and checks whether merge has results available for that run - */ - public void pullResultsFromMerge() - { - Date lastRun = MergeSyncManager.get().getLastRun(); - _log.info("Pulling results from merge verified since: {}", lastRun == null ? "never run before" : _dateTimeFormat.format(lastRun)); - - if (lastRun == null) - { - lastRun = new Date(); - } - - TableInfo mergeOrders = MergeSyncManager.get().getMergeSchema().getTable(MergeSyncManager.TABLE_MERGE_ORDERS); - if (mergeOrders == null) - { - _log.warn("Unable to find merge orders table, aborting"); - return; - } - - User u = MergeSyncManager.get().getLabKeyUser(); - Container c = MergeSyncManager.get().getLabKeyContainer(); - if (u == null || c == null) - { - _log.error("Unknown user or container, cannot pull results from merge"); - return; - } - - DbSchema mergeSchema = MergeSyncManager.get().getMergeSchema(); - if (mergeSchema == null) - { - _log.error("Unable to find merge schema, aborting"); - return; - } - - TableInfo resultTable = MergeSyncUserSchema.getMergeDataTable(mergeSchema, null); - if (resultTable == null) - { - _log.error("Unable to create merge results table"); - return; - } - - try (ViewContext.StackResetter ignored = ViewContext.pushMockViewContext(u, c, new ActionURL("onprc_ehr", "fake.view", c))) - { - QueryService.get().setEnvironment(QueryService.Environment.USER, u); - - Date syncStart = new Date(); - pullResults(u, c, mergeSchema, lastRun); - - MergeSyncManager.get().setLastRun(syncStart); - - validateRuns(c, u, mergeSchema, 30, syncStart); - - if (MergeSyncManager.get().doSyncAnimalsAndProjects()) - { - syncAnimalsToMerge(c, u, mergeSchema); - syncProjectsToMerge(c, u, mergeSchema); - } - } - finally - { - QueryService.get().clearEnvironment(); - } - } - - private void pullResults(final User u, final Container c, DbSchema mergeSchema, Date minDate) - { - TableInfo clinpathRuns = QueryService.get().getUserSchema(u, c, "study").getTable("clinpathRuns"); - if (clinpathRuns == null) - { - _log.error("Unable to find study.clinpathRuns, aborting"); - return; - } - - TableInfo runsTable = MergeSyncUserSchema.getMergeRunsTable(mergeSchema, null); - final TableInfo mergeResultTable = MergeSyncUserSchema.getMergeDataTable(mergeSchema, null); - - //sync on date/time in order to avoid additional work - SimpleFilter runFilter = new SimpleFilter(FieldKey.fromString("dateVerified"), minDate, CompareType.GTE); - runFilter.addCondition(FieldKey.fromString("status"), "V"); - - //Modified: 4-11-2016 R.Blasa allow both numeric and non-numeric ids - //runFilter.addCondition(FieldKey.fromString("numericLastName"), true, CompareType.EQUAL); - - TableSelector runTs = new TableSelector(runsTable, runFilter, null); - long count = runTs.getRowCount(); - if (count > 0) - { - _log.info("found {} new merge runs to sync", count); - processRuns(c, u, runTs, mergeResultTable); - _log.info("finished pulling results from merge"); - } - else - { - _log.info("no merge runs found, nothing to do"); - } - } - - private TableInfo getClinpathRuns(Container c, User u) - { - TableInfo clinpathRuns = QueryService.get().getUserSchema(u, c, "study").getTable("clinpathRuns"); - if (clinpathRuns == null) - { - _log.error("Unable to find study.clinpathRuns, aborting"); - return null; - } - - return clinpathRuns; - } - - private void processRuns(final Container c, final User u, TableSelector runTs, final TableInfo mergeResultTable) - { - runTs.forEach(new Selector.ForEachBlock<>() - { - @Override - public void exec(ResultSet runRs) throws SQLException - { - processSingleRun(c, u, mergeResultTable, runRs, false); - } - }); - } - - private void validateRuns(final Container c, final User u, DbSchema mergeSchema, int offset, final Date syncStart) - { - TableInfo runsTable = MergeSyncUserSchema.getMergeRunsTable(mergeSchema, null); - - Calendar minDate = Calendar.getInstance(); - minDate.setTime(new Date()); - minDate.add(Calendar.DATE, -1 * offset); - - SimpleFilter runFilter = new SimpleFilter(FieldKey.fromString("dateVerified"), minDate, CompareType.GTE); - runFilter.addCondition(FieldKey.fromString("dateVerified"), null, CompareType.NONBLANK); - runFilter.addCondition(FieldKey.fromString("status"), "V"); - - //Removed 4-12-2016 R.Blasa allow both nuemric and non-numeric ids - // runFilter.addCondition(FieldKey.fromString("numericLastName"), true, CompareType.EQUAL); - - final TableSelector runTs = new TableSelector(runsTable, runFilter, null); - if (runTs.exists()) - { - _log.info("verifying previous {} days of merge runs are present", offset); - runTs.forEach(new Selector.ForEachBlock<>() - { - @Override - public void exec(ResultSet mergeRunRs) throws SQLException - { - Integer accession = mergeRunRs.getInt("accession"); - Integer panelId = mergeRunRs.getInt("panelid"); - - Map existingRequest = getExistingRequest(c, u, accession, panelId, false); - if (existingRequest == null || existingRequest.get("runLsid") == null) //proxy for whether this record existing in clinpath runs - { - if (existingRequest == null || existingRequest.get("objectid") == null) //proxy for whether a record existing in orders synced. this might - { - //NOTE: if the dateVerified is greater than the sync start, it was most likely verified during this sync operation and we'll pick it up during the next sync anyway - String msg = "merge run missing: " + accession + " / " + panelId + ". No record of previous sync. Date verified: " + _dateTimeFormat.format(mergeRunRs.getDate("dateVerified")); - if (mergeRunRs.getDate("dateVerified").getTime() <= syncStart.getTime()) - { - _log.error(msg); - } - else - { - _log.warn(msg); - } - //processSingleRun(c, u, mergeResultTable, mergeRunRs, false); - } - else if (existingRequest.get("deletedate") != null) - { - //run was deleted from LabKey, ignore - } - else if (existingRequest.get("runLsid") == null) - { - _log.error("merge run missing: {} / {}. Record of previous sync, but no clinpathRun record. Date verified: {}", accession, panelId, _dateTimeFormat.format(mergeRunRs.getDate("dateVerified"))); - //processSingleRun(c, u, mergeResultTable, mergeRunRs, false); - } - } - } - }); - } - } - - public void syncSingleRun(final Container c, final User u, final Integer mergeAccession, final Integer mergeTestId) throws SQLException - { - DbSchema mergeSchema = MergeSyncManager.get().getMergeSchema(); - if (mergeSchema == null) - return; - - _log.info("attempting to resync single run: {} / {}", mergeAccession, mergeTestId); - - TableInfo runsTable = MergeSyncUserSchema.getMergeRunsTable(mergeSchema, null); - final TableInfo mergeResultTable = MergeSyncUserSchema.getMergeDataTable(mergeSchema, null); - - SimpleFilter runFilter = new SimpleFilter(FieldKey.fromString("accession"), mergeAccession, CompareType.EQUAL); - runFilter.addCondition(FieldKey.fromString("panelid"), mergeTestId); - runFilter.addCondition(FieldKey.fromString("status"), "V"); - - //Modified: 4-11-2016 R.Blasa allow both numeric and non-numeric ids - // runFilter.addCondition(FieldKey.fromString("numericLastName"), true, CompareType.EQUAL); - - - - - TableSelector runTs = new TableSelector(runsTable, runFilter, null); - runTs.forEach(runRs -> { - //delete results if we expect automatic results - String mergeService = runRs.getString("servicename_abbr"); - String labkeyServiceName = resolveServiceName(c, u, mergeService, null); - if (shouldSyncResults(labkeyServiceName)) - { - deleteExistingResults(c, u, mergeAccession, mergeTestId); - } - else - { - _log.info("this service type does not have automatic results, so we will not delete any existing results"); - } - - try - { - Map existingRequest = getExistingRequest(c, u, mergeAccession, mergeTestId, false); - if (existingRequest != null) - { - TableSelector runsTs = new TableSelector(getClinpathRuns(c, u), PageFlowUtil.set("lsid", "Id", "project", "date"), new SimpleFilter(FieldKey.fromString("objectid"), existingRequest.get("runid")), null); - Map runRow = runsTs.getMap(); - if (runRow != null) - { - runRow = new CaseInsensitiveHashMap<>(runRow); - - boolean changed = false; - if (!runRow.get("Id").equals(runRs.getString("animalId"))) - { - runRow.put("Id", runRs.getString("Id")); - changed = true; - } - - if (!DateUtils.isSameInstant((Date) runRow.get("date"), runRs.getDate("date"))) - { - runRow.put("date", runRs.getDate("date")); - changed = true; - } - - Integer project = resolveProject(c, u, runRs.getString("projectName")); - if (project != null && !project.equals(runRow.get("project"))) - { - runRow.put("project", project); - changed = true; - } - - if (changed) - { - Map keys = new CaseInsensitiveHashMap<>(); - keys.put("lsid", runRow.get("lsid")); - getClinpathRuns(c, u).getUpdateService().updateRows(u, c, Collections.singletonList(runRow), Collections.singletonList(keys), null, getExtraContext()); - } - } - } - - processSingleRun(c, u, mergeResultTable, runRs, true); - } - catch (InvalidKeyException | BatchValidationException | QueryUpdateServiceException e) - { - throw new RuntimeException(e.getMessage(), e); - } - }); - } - - public void deleteExistingResults(final Container c, final User u, Integer mergeAccession, Integer mergeTestId) throws SQLException - { - Map request = getExistingRequest(c, u, mergeAccession, mergeTestId, false); - if (request == null) - { - return; - } - - String runId = (String)request.get("runid"); - if (runId == null) - { - return; - } - - TableSelector ts = new TableSelector(getClinpathRuns(c, u), Collections.singleton("servicerequested"), new SimpleFilter(FieldKey.fromString("objectid"), runId), null); - String servicename = ts.getObject(String.class); - if (servicename == null) - { - return; - } - - try - { - TableInfo resultTable = resolveServiceResultTable(c, u, servicename); - if (resultTable == null) - { - _log.error("Unable to find result table matching: {}", servicename); - return; - } - - List lsids = new TableSelector(resultTable, Collections.singleton("lsid"), new SimpleFilter(FieldKey.fromString("runid"), runId), null).getArrayList(String.class); - if (lsids != null && !lsids.isEmpty()) - { - List> toDelete = new ArrayList<>(); - for (String lsid : lsids) - { - Map row = new CaseInsensitiveHashMap<>(); - row.put("lsid", lsid); - - toDelete.add(row); - } - - List deleted = resultTable.getUpdateService().deleteRows(u, c, toDelete, null, getExtraContext()); - _log.info("pre-deleted {} rows from table: {}", deleted.size(), resultTable.getName()); - } - else - { - _log.info("no existing results found, nothing to delete"); - } - } - catch (InvalidKeyException | BatchValidationException | QueryUpdateServiceException e) - { - throw new RuntimeException(e.getMessage(), e); - } - } - - private void processSingleRun(final Container c, final User u, TableInfo mergeResultTable, ResultSet mergeRunRs, final boolean forceSyncResults) throws SQLException - { - Integer accession = mergeRunRs.getInt("accession"); - Integer panelId = mergeRunRs.getInt("panelid"); - - SimpleFilter resultFilter = new SimpleFilter(FieldKey.fromString("accession"), accession); - resultFilter.addCondition(FieldKey.fromString("panelid"), panelId); - resultFilter.addCondition(FieldKey.fromString("isFinal"), "Y"); - resultFilter.addCondition(FieldKey.fromString("status"), "V"); - resultFilter.addCondition(FieldKey.fromString("text_result"), EXCLUDED_RESULTS, CompareType.NOT_IN); - - final Map>> resultsToCreate = new HashMap<>(); - final Map resultDatasets = new HashMap<>(); - - TableInfo tableOrdersSynced = MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_ORDERSSYNCED); - Map existingRequest = getExistingRequest(c, u, accession, panelId, true); - final String existingRunId = existingRequest == null ? null : (String)existingRequest.get("runid"); - _log.info("processing order: {}", accession); - _log.info("existingRunId: {}", existingRunId); - - Set completedTasks = new HashSet<>(); - TableSelector resultsTs = new TableSelector(mergeResultTable, resultFilter, null); - resultsTs.forEach(new Selector.ForEachBlock<>() - { - @Override - public void exec(ResultSet rs) throws SQLException - { - Map resultRow = processResultSet(c, u, rs, existingRunId); - if (resultRow == null) - { - return; //this could occur if the result is simply a placeholder like 'RECEIVED' - } - - TableInfo dataset = getResultDataset(c, u, rs.getString("servicename_abbr"), existingRunId); - if (dataset == null) - { - return; //count on getResultDataset() for error reporting - } - - resultDatasets.put(dataset.getName(), dataset); - - List> list = resultsToCreate.get(dataset.getName()); - if (list == null) - list = new ArrayList<>(); - - list.add(resultRow); - - resultsToCreate.put(dataset.getName(), list); - } - }); - - DbScope scope = DbScope.getLabKeyScope(); - try (DbScope.Transaction transaction = scope.ensureTransaction()) - { - String taskId = null; - String runId = null; - String runLsid = null; - String runTaskId = null; - String orderObjectId = null; - if (existingRequest != null) - { - taskId = (String)existingRequest.get("taskid"); - runId = (String)existingRequest.get("runid"); - runLsid = (String)existingRequest.get("runLsid"); - orderObjectId = (String)existingRequest.get("objectid"); - runTaskId = (String)existingRequest.get("taskid"); - Boolean resultsReceived = (Boolean)existingRequest.get("resultsreceived"); - - if (resultsReceived && !forceSyncResults) - { - _log.info("This order already has results imported, skipping: {}/{}", accession, panelId); - return; - } - } - - String mergeService = mergeRunRs.getString("servicename_abbr"); - String labkeyServiceName = resolveServiceName(c, u, mergeService, runId); - boolean expectResults = shouldSyncResults(labkeyServiceName); - - //NOTE: only put this into a task if we expect to sync results. otherwise leave it in the queue and manual entry - if (taskId == null && expectResults) - { - taskId = createTask(c, u, mergeRunRs.getString("animalId"), mergeRunRs.getDate("date")); - } - - if (runId == null) - { - Map map = createRun(c, u, mergeRunRs, taskId, (expectResults && resultsToCreate.isEmpty())); - runId = map == null ? null : (String)map.get("runid"); - } - - if (runLsid == null && runId != null) - { - runLsid = getRunLsid(c, u, accession, panelId, runId); - runTaskId = getRunTaskId(c, u, accession, panelId, runId); - } - - String requestId = null; - if (orderObjectId == null) - { - orderObjectId = createOrderRecord(c, u, taskId, runId, accession, panelId, mergeRunRs.getDate("date")); - } - else - { - requestId = getRequestForOrder(c, u, orderObjectId); - } - - if (expectResults) - { - if (resultsToCreate.isEmpty()) - { - _log.error("Merge request for {} was expected to have results, but does not. Accession: {}, panelId: {}", mergeService, accession, panelId); - } - - for (String datasetName : resultsToCreate.keySet()) - { - List> rows = resultsToCreate.get(datasetName); - for (Map row : rows) - { - row.put("taskid", taskId); - row.put("runid", runId); - row.put("requestid", requestId); - } - - TableInfo ds = resultDatasets.get(datasetName); - - _log.info("creating {} results: {}", datasetName, resultsToCreate.get(datasetName).size()); - - BatchValidationException errors = new BatchValidationException(); - ds.getUpdateService().insertRows(u, c, resultsToCreate.get(datasetName), errors, null, getExtraContext()); - } - - //if successful, we need to mark the run as completed - _log.info("marking clinpath run as complete: {}", runId); - Map toUpdate = new CaseInsensitiveHashMap<>(); - toUpdate.put("lsid", runLsid); - toUpdate.put("QCStateLabel", EHRService.QCSTATES.Completed.getLabel()); - - Map toUpdateKeys = new CaseInsensitiveHashMap<>(); - toUpdateKeys.put("lsid", runLsid); - - getClinpathRuns(c, u).getUpdateService().updateRows(u, c, Collections.singletonList(toUpdate), Collections.singletonList(toUpdateKeys), null, getExtraContext()); - completedTasks.add(taskId); - } - else - { - if (!resultsToCreate.isEmpty()) - { - _log.error("Merge request for {} was not expected to have results, but does. Accession: {}, panelId: {}", mergeService, accession, panelId); - for (String tableName : resultsToCreate.keySet()) - { - _log.error("{}: {}", tableName, resultsToCreate.get(tableName).size()); - } - } - else - { - //note: use whether this record is part of a task as a proxy for whether someone has worked with it or not - if (runTaskId == null) - { - Map toUpdate = new CaseInsensitiveHashMap<>(); - toUpdate.put("lsid", runLsid); - toUpdate.put("QCStateLabel", EHRService.QCSTATES.RequestSampleDelivered.getLabel()); - - Map toUpdateKeys = new CaseInsensitiveHashMap<>(); - toUpdateKeys.put("lsid", runLsid); - - _log.info("marking clinpath run as delivered: {}", runId); - getClinpathRuns(c, u).getUpdateService().updateRows(u, c, Collections.singletonList(toUpdate), Collections.singletonList(toUpdateKeys), null, getExtraContext()); - } - else - { - _log.info("run is already part of a task, will not set qcstate"); - } - } - } - - for (String t : completedTasks) - { - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("taskid"), t); - filter.addCondition(FieldKey.fromString("qcstate"), EHRService.QCSTATES.Completed.getQCState(c).getRowId(), CompareType.NEQ_OR_NULL); - TableSelector ts = new TableSelector(getClinpathRuns(c, u), filter, null); - if (!ts.exists()) - { - _log.info("task has no non-completed runs, marking complete: {}", t); - TableInfo taskTable = DbSchema.get("ehr").getTable("tasks"); - Map toUpdate = new CaseInsensitiveHashMap<>(); - toUpdate.put("taskid", t); - toUpdate.put("qcstate", EHRService.QCSTATES.Completed.getQCState(c).getRowId()); - Table.update(u, taskTable, toUpdate, t); - } - else - { - _log.info("task still has non-completed runs, will not mark complete: {}", t); - } - } - - //update the LK table to indicate results are received - Map toUpdate = new CaseInsensitiveHashMap<>(); - toUpdate.put("resultsreceived", true); - toUpdate.put("objectid", orderObjectId); - toUpdate.put("taskid", taskId); - toUpdate.put("requestid", requestId); - Table.update(u, tableOrdersSynced, toUpdate, orderObjectId); - - transaction.commit(); - } - catch (BatchValidationException | DuplicateKeyException | InvalidKeyException | QueryUpdateServiceException e) - { - _log.error(e.getMessage(), e); - throw new RuntimeException(e.getMessage(), e); - } - } - - private boolean shouldSyncResults(String labkeyServiceName) - { - if (labkeyServiceName ==null) - return false; - - String cacheKey = this.getClass().getName() + "||" + "||resultsExpectedMap"; - if (CacheManager.getSharedCache().get(cacheKey) == null) - { - TableInfo ti = MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_TESTNAMEMAPPING); - TableSelector ts = new TableSelector(ti); - Map ret = new HashMap<>(); - for (Map row : ts.getMapArray()) - { - ret.put((String)row.get("servicename"), (Boolean)row.get("automaticresults")); - } - - CacheManager.getSharedCache().put(cacheKey, ret); - } - - Map map = (Map)CacheManager.getSharedCache().get(cacheKey); - - return map.get(labkeyServiceName) != null ? map.get(labkeyServiceName) : false; - } - - private String createTask(Container c, User u, String animalId, Date date) - { - String key = animalId + " " + _dateFormat.format(date); - if (_cachedTasks.containsKey(key)) - { - return _cachedTasks.get(key); - } - - String taskId = new GUID().toString().toUpperCase(); - Map taskRecord = new CaseInsensitiveHashMap<>(); - taskRecord.put("taskid", taskId); - taskRecord.put("title", key); - taskRecord.put("category", "Task"); - taskRecord.put("formType", "Labwork"); - taskRecord.put("assignedto", u.getUserId()); - taskRecord.put("container", c.getId()); - taskRecord.put("created", new Date()); - taskRecord.put("createdby", u.getUserId()); - taskRecord.put("modified", new Date()); - taskRecord.put("modifiedby", u.getUserId()); - taskRecord.put("QCStateLabel", EHRService.QCSTATES.Completed.getLabel()); - - TableInfo taskTable = DbSchema.get("ehr").getTable("tasks"); - - _log.info("Creating task for merge sync: {}", key); - Table.insert(u, taskTable, taskRecord); - - _cachedTasks.put(key, taskId); - - return taskId; - } - - private Map getExistingRequest(Container c, User u, Integer accession, Integer panelId, boolean validateRunId) - { - TableInfo tableOrdersSynced = MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_ORDERSSYNCED); - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("order_accession"), accession); - filter.addCondition(FieldKey.fromString("container"), c.getId()); - - // this is designed to handle legacy data and newer data. the legacy data has only been tracked by accession. - // data synced via LK are tracked using accession and panelId - filter.addClause(new SimpleFilter.OrClause( - new CompareType.CompareClause(FieldKey.fromString("test_accession"), CompareType.EQUAL, panelId), - new CompareType.CompareClause(FieldKey.fromString("test_accession"), CompareType.ISBLANK, null) - )); - - TableSelector ts = new TableSelector(tableOrdersSynced, PageFlowUtil.set("objectid", "resultsreceived", "runid", "taskid", "deletedate"), filter, new Sort("-created")); - List ret = ts.getArrayList(Map.class); - if (ret.isEmpty()) - return null; - - Map map = new CaseInsensitiveHashMap(ret.getFirst()); - - //make sure this runId actually exists - String runId = (String)map.get("runid"); - if (runId != null) - { - TableInfo ti = getClinpathRuns(c, u); - TableSelector ts2 = new TableSelector(ti, PageFlowUtil.set("lsid", "qcstate", "taskid"), new SimpleFilter(FieldKey.fromString("objectid"), runId), null); - Map row = ts2.getObject(Map.class); - if (row != null) - { - map.put("runLsid", row.get("lsid")); - map.put("qcstate", row.get("qcstate")); - map.put("taskid", row.get("taskid")); - - //NOTE: only return the map if this run is really found - return map; - } - else if (!validateRunId) - { - return map; - } - else - { - _log.error("There is a record of a synced merge request ({}), but the runId was not found: {}. the request will be recreated.", accession, runId); - } - } - - return validateRunId ? null : map; - } - - private Map processResultSet(Container c, User u, ResultSet rs, @Nullable String runId) throws SQLException - { - String animalId = rs.getString("animalId"); - Date date = convertGMTToLocal(rs.getTimestamp("date")); - // _log.info("Show Lab Record date: " + date); //Removed 3-24-2016 Blasa - - String projectName = rs.getString("projectName"); - //Date datecollected = convertGMTToLocal(rs.getDate("datecollected")); - String servicename_abbr = rs.getString("servicename_abbr"); - String testid_abbr = rs.getString("testid_abbr"); - - String text_result = rs.getString("text_result"); - Double numeric_result = rs.getDouble("numeric_result"); - numeric_result = rs.wasNull() ? null : numeric_result; - - String remark = rs.getString("remark"); - if (rs.getString("runRemark") != null) - { - if (remark == null) - remark = rs.getString("runRemark"); - else - remark = remark + "\n" + rs.getString("runRemark"); - } - Integer project = resolveProject(c, u, projectName); - - String servicename = resolveServiceName(c, u, servicename_abbr, null); - if (servicename == null) - { - _log.error("Unable to resolve merge servicename: {}", servicename_abbr); - return null; - } - - Map resultRow = new CaseInsensitiveHashMap<>(); - resultRow.put("Id", animalId); - resultRow.put("date", date); - resultRow.put("project", project); - resultRow.put("testid", testid_abbr); - resultRow.put("remark", remark); - resultRow.put("units", resolveUnits(c, u, null, testid_abbr)); - - //NOTE: when a result is flagged as an error, merge seems to store 0 in the numeric result, while keeping the original value as the text result - //i dont like this behavior, but if there is a remark (a proxy for having an error), the numeric result is 0, and text result is numeric, then defer to the latter - if (!StringUtils.isEmpty(remark) && (numeric_result == null || numeric_result == 0.0) && !StringUtils.isEmpty(text_result) && text_result.matches("[-+]?\\d*\\.?\\d+")) - { - _log.info("deferring to text result instead of numeric result: {}", text_result); - numeric_result = ConvertHelper.convert(text_result, Double.class); - } - - resultRow.put("result", numeric_result); - if (numeric_result == null) - { - resultRow.put("qualresult", text_result); - } - - return resultRow; - } - - private TableInfo getResultDataset(Container c, User u, String serviceName, @Nullable String runId) - { - String servicename = resolveServiceName(c, u, serviceName, runId); - if (servicename == null) - { - return null; - } - - TableInfo resultTable = resolveServiceResultTable(c, u, servicename); - if (resultTable == null) - { - _log.error("Unable to find result table matching: {}", servicename); - return null; - } - - return resultTable; - } - - private Date convertGMTToLocal(Date d) - { - if (d == null) - return null; - - //NOTE: this is handled at the UserSchema level now - return d; - } - - private String getRunLsid(Container c, User u, Integer accessionId, Integer panelId, String runId) - { - String key = accessionId + "||" + panelId; - if (_cachedRuns.containsKey(key)) - { - return (String)_cachedRuns.get(key).get("lsid"); - } - - Map map = cacheRun(c, u, key, runId); - - return (String)map.get("lsid"); - } - - private String getRunTaskId(Container c, User u, Integer accessionId, Integer panelId, String runId) - { - String key = accessionId + "||" + panelId; - if (_cachedRuns.containsKey(key)) - { - return (String)_cachedRuns.get(key).get("taskid"); - } - - Map map = cacheRun(c, u, key, runId); - - return (String)map.get("taskid"); - } - - private Map cacheRun(Container c, User u, String key, String runId) - { - TableInfo ti = getClinpathRuns(c, u); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("lsid", "qcstate", "taskid"), new SimpleFilter(FieldKey.fromString("objectid"), runId), null); - Map found = ts.getObject(Map.class); - Map map = new CaseInsensitiveHashMap<>(); - if (found != null) - { - map.put("lsid", found.get("lsid")); - map.put("runid", runId); - map.put("qcstate", found.get("qcstate")); - map.put("taskid", found.get("taskid")); - } - - _cachedRuns.put(key, map); - - return map; - } - - private Map createRun(Container c, User u, ResultSet mergeRunRs, String taskId, boolean hasResults) throws SQLException - { - Integer accessionId = mergeRunRs.getInt("accession"); - int panelId = mergeRunRs.getInt(("panelid")); - - String key = accessionId + "||" + panelId; - if (_cachedRuns.containsKey(key)) - { - return _cachedRuns.get(key); - } - - String animalId = mergeRunRs.getString("animalId"); - Date date = convertGMTToLocal(mergeRunRs.getTimestamp("date")); - // _log.info("Show clinPath Record date: " + date); //Removed 3-24-2016 Blasa - - Integer project = resolveProject(c, u, mergeRunRs.getString("projectName")); - String servicename = resolveServiceName(c, u, mergeRunRs.getString("servicename_abbr"), null); - - String runId = new GUID().toString().toUpperCase(); - Map runRow = new CaseInsensitiveHashMap<>(); - runRow.put("Id", animalId); - runRow.put("date", date); - runRow.put("project", project); - runRow.put("objectid", runId); - runRow.put("taskid", taskId); - runRow.put("servicerequested", servicename); - - String tissue = resolveTissueForService(servicename, u, c); - if (tissue != null) - runRow.put("tissue", tissue); - - String method = resolveMethodForService(servicename, u, c); - if (method != null) - runRow.put("method", method); - - EHRService.QCSTATES qc = hasResults ? EHRService.QCSTATES.Completed : EHRService.QCSTATES.RequestSampleDelivered; - - runRow.put("QCStateLabel", qc.getLabel()); - - TableInfo clinpathRuns = getClinpathRuns(c, u); - try - { - _log.info("creating clinpath run for merge data: {}", key); - BatchValidationException errors = new BatchValidationException(); - List> createdRunRows = clinpathRuns.getUpdateService().insertRows(u, c, Arrays.asList(runRow), errors, null, getExtraContext()); - if (errors.hasErrors()) - { - throw errors; - } - - if (createdRunRows == null) - { - throw new RuntimeException("Unable to create clinpath run record for: " + key); - } - - if (!createdRunRows.isEmpty()) - { - Map map = new CaseInsensitiveHashMap<>(); - map.put("runid", runId); - map.put("lsid", createdRunRows.getFirst().get("lsid")); - map.put("taskid", createdRunRows.getFirst().get("taskid")); - map.put("qcstate", qc.getQCState(c).getRowId()); - - _cachedRuns.put(key, map); - } - - return _cachedRuns.get(key); - } - catch (BatchValidationException | DuplicateKeyException | QueryUpdateServiceException | SQLException e) - { - _log.error(e.getMessage(), e); - throw new RuntimeException(e.getMessage(), e); - } - } - - public Map getExtraContext() - { - Map map = new HashMap<>(); - map.put("quickValidation", true); - map.put("generatedByServer", true); - - return map; - } - - private String getRequestForOrder(Container c, User u, String objectId) - { - TableInfo ti = MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_ORDERSSYNCED); - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("objectid"), objectId); - TableSelector ts = new TableSelector(ti, Collections.singleton("requestid"), filter, null); - List ret = ts.getArrayList(String.class); - - return ret.isEmpty() ? null : ret.getFirst(); - } - - private String createOrderRecord(Container c, User u, String taskId, String runId, Integer accession, Integer panelId, Date date) - { - String objectId = new GUID().toString().toUpperCase(); - Map toInsert = new CaseInsensitiveHashMap<>(); - toInsert.put("resultsreceived", false); - toInsert.put("taskid", taskId); - toInsert.put("runid", runId); - toInsert.put("order_accession", accession); - toInsert.put("test_accession", panelId); - toInsert.put("merge_datecreated", date); - toInsert.put("merge_dateposted", new Date()); - toInsert.put("objectid", objectId); - toInsert.put("container", c.getId()); - toInsert.put("created", new Date()); - toInsert.put("createdby", u.getUserId()); - toInsert.put("modified", new Date()); - toInsert.put("modifiedby", u.getUserId()); - - _log.info("creating order record for merge data: {}/{}", accession, panelId); - Table.insert(u, MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_ORDERSSYNCED), toInsert); - - return objectId; - } - - private String resolveServiceName(Container c, User u, String mergeServiceName, @Nullable String runId) - { - if (runId != null) - { - TableInfo clinpathRuns = getClinpathRuns(c, u); - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("objectId"), runId); - TableSelector ts = new TableSelector(clinpathRuns, Collections.singleton("servicerequested"), filter, null); - List ret = ts.getArrayList(String.class); - if (ret != null && !ret.isEmpty()) - { - return ret.getFirst(); - } - } - - String cacheKey = this.getClass().getName() + "||" + c.getId() + "||testNameMap"; - Map map = (Map)CacheManager.getSharedCache().get(cacheKey); - if (map == null) - { - TableInfo ti = MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_MERGE_TO_LK_MAPPING); - TableSelector ts = new TableSelector(ti); - map = new HashMap<>(); - for (Map row : ts.getMapArray()) - { - map.put((String)row.get("mergetestname"), (String)row.get("servicename")); - } - - CacheManager.getSharedCache().put(cacheKey, map); - } - - return map.get(mergeServiceName) == null ? mergeServiceName : map.get(mergeServiceName); - } - - private String resolveTissueForService(String servicename, User u, Container c) - { - if (_cachedTissues.containsKey(servicename)) - { - return _cachedTissues.get(servicename); - } - - TableInfo ti = QueryService.get().getUserSchema(u, c, "ehr_lookups").getTable("labwork_services"); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("tissue"), new SimpleFilter(FieldKey.fromString("servicename"), servicename), null); - _cachedTissues.put(servicename, ts.getObject(String.class)); - - return _cachedTissues.get(servicename); - } - - private String resolveMethodForService(String servicename, User u, Container c) - { - if (_cachedMethods.containsKey(servicename)) - { - return _cachedMethods.get(servicename); - } - - TableInfo ti = QueryService.get().getUserSchema(u, c, "ehr_lookups").getTable("labwork_services"); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("method"), new SimpleFilter(FieldKey.fromString("servicename"), servicename), null); - _cachedMethods.put(servicename, ts.getObject(String.class)); - - return _cachedMethods.get(servicename); - } - - private String resolveUnits(Container c, User u, String category, String testid) - { - String cacheKey = this.getClass().getName() + "||" + c.getId() + "||testUnitMap"; - Map> ret = (Map)CacheManager.getSharedCache().get(cacheKey); - if (ret == null) - { - TableInfo ti = QueryService.get().getUserSchema(u, c, "ehr_lookups").getTable("lab_tests"); - TableSelector ts = new TableSelector(ti); - final Map> results = new HashMap<>(); - ts.forEach(rs -> { - String key = rs.getString("type") + "||" + rs.getString("testid"); - Map map = new HashMap<>(); - map.put("category", rs.getString("type")); - map.put("testid", rs.getString("testid")); - map.put("units", rs.getString("units")); - - results.put(key, map); - }); - - ret = results; - CacheManager.getSharedCache().put(cacheKey, ret); - } - - String key = category + "||" + testid; - Map map = ret.get(key); - - return map == null ? null : (String)map.get("units"); - } - - private TableInfo resolveServiceResultTable(Container c, User u, String servicename) - { - if (_cachedResultTables.containsKey(servicename)) - { - return _cachedResultTables.get(servicename); - } - - TableInfo ti = QueryService.get().getUserSchema(u, c, "ehr_lookups").getTable("labwork_services"); - Set fks = PageFlowUtil.set(FieldKey.fromString("dataset/category")); - final Map cols = QueryService.get().getColumns(ti, fks); - TableSelector ts = new TableSelector(ti, cols.values(), new SimpleFilter(FieldKey.fromString("servicename"), servicename), null); - List datasetNames = ts.getArrayList(String.class); - String datasetName = datasetNames == null || datasetNames.isEmpty() ? null : datasetNames.getFirst(); - if (datasetName == null) - { - _cachedResultTables.put(servicename, null); - return null; - } - - TableInfo ret = null; - int datasetId = StudyService.get().getDatasetIdByName(c, datasetName); - if (datasetId > -1) - { - Dataset ds = StudyService.get().getDataset(c, datasetId); - ret = QueryService.get().getUserSchema(u, c, "study").getTable(ds.getName()); - } - - _cachedResultTables.put(servicename, ret); - return ret; - } - - private void syncAnimalsToMerge(Container c, User u, DbSchema mergeSchema) - { - try - { - int datasetId = StudyService.get().getDatasetIdByName(c, "demographics"); - if (datasetId > -1) - { - Dataset ds = StudyService.get().getDataset(c, datasetId); - String realTableName = ds.getDomain().getStorageTableName(); - TableInfo realTable = DbSchema.get("studydataset", DbSchemaType.Provisioned).getTable(realTableName); - - TableInfo patients = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_PATIENTS); - - - //first find IDs we need to add. even though the 2 DBs are on the same server instance for us, dont make that assumption and compare lists in java - List livingAnimals = new TableSelector(realTable, PageFlowUtil.set("participantid"), new SimpleFilter(FieldKey.fromString("calculated_status"), "Alive"), null).getArrayList(String.class); - int start = 0; - int batchSize = 500; - while (start < livingAnimals.size()) - { - List sublist = livingAnimals.subList(start, Math.min(livingAnimals.size(), start + batchSize)); - start = start + batchSize; - - List idsPresent = new TableSelector(patients, PageFlowUtil.set("PT_LNAME"), new SimpleFilter(FieldKey.fromString("PT_LNAME"), sublist, CompareType.IN), null).getArrayList(String.class); - sublist.removeAll(idsPresent); - if (!sublist.isEmpty()) - { - _log.info("creating {} animals in merge", sublist.size()); - for (String id : sublist) - { - RequestSyncHelper.createPatient(mergeSchema, c, u, id); - } - } - } - - //then find any IDs we need to mark as dead in merge - List deadAnimals = new TableSelector(realTable, PageFlowUtil.set("participantid"), new SimpleFilter(FieldKey.fromString("calculated_status"), "Dead", CompareType.EQUAL), null).getArrayList(String.class); - start = 0; - while (start < deadAnimals.size()) - { - List sublist = deadAnimals.subList(start, Math.min(deadAnimals.size(), start + batchSize)); - start = start + batchSize; - - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("PT_LNAME"), sublist, CompareType.IN); - filter.addCondition(FieldKey.fromString("PT_FNAME"), "Deceased", CompareType.DOES_NOT_CONTAIN); - List idsToChange = new TableSelector(patients, PageFlowUtil.set("PT_NUM"), filter, null).getArrayList(String.class); - if (!idsToChange.isEmpty()) - { - _log.info("marking {} animals as deceased in merge", idsToChange.size()); - for (String ptNum : idsToChange) - { - SQLFragment sql = new SQLFragment("UPDATE dbo.patients SET pt_fname = left(rtrim(pt_fname), 5) + ' ' + '*Deceased*' WHERE PT_NUM = ?", ptNum); - new SqlExecutor(mergeSchema).execute(sql); - } - } - } - - //then shipped - List shippedAnimals = new TableSelector(realTable, PageFlowUtil.set("participantid"), new SimpleFilter(FieldKey.fromString("calculated_status"), "Shipped", CompareType.EQUAL), null).getArrayList(String.class); - start = 0; - while (start < shippedAnimals.size()) - { - List sublist = shippedAnimals.subList(start, Math.min(shippedAnimals.size(), start + batchSize)); - start = start + batchSize; - - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("PT_LNAME"), sublist, CompareType.IN); - filter.addCondition(FieldKey.fromString("PT_FNAME"), "Sold", CompareType.DOES_NOT_CONTAIN); - List idsToChange = new TableSelector(patients, PageFlowUtil.set("PT_NUM"), filter, null).getArrayList(String.class); - if (!idsToChange.isEmpty()) - { - _log.info("marking {} animals as shipped in merge", idsToChange.size()); - for (String ptNum : idsToChange) - { - SQLFragment sql = new SQLFragment("UPDATE dbo.patients SET pt_fname = left(rtrim(pt_fname), 5) + ' ' + '*Sold*' WHERE PT_NUM = ?", ptNum); - new SqlExecutor(mergeSchema).execute(sql); - } - } - } - } - } - catch (Exception e) - { - _log.error(e.getMessage(), e); - } - } - - private void syncProjectsToMerge(final Container c, final User u, final DbSchema mergeSchema) - { - TableInfo projects = QueryService.get().getUserSchema(u, c, "ehr").getTable("project"); - TableInfo insurance = mergeSchema.getTable("insurance"); - - //first create any project missing in merge - List activeProjects = new TableSelector(projects, PageFlowUtil.set("displayName"), new SimpleFilter(FieldKey.fromString("enddateCoalesced"), new Date(), CompareType.DATE_GTE), null).getArrayList(String.class); - int start = 0; - int batchSize = 500; - while (start < activeProjects.size()) - { - List sublist = activeProjects.subList(start, Math.min(activeProjects.size(), start + batchSize)); - start = start + batchSize; - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("INS_NAME"), sublist, CompareType.IN); - filter.addCondition(FieldKey.fromString("INS_TYPE"), "I"); //this will return only those active in merge - - List projectsPresent = new TableSelector(insurance, PageFlowUtil.set("INS_NAME"), filter, null).getArrayList(String.class); - sublist.removeAll(projectsPresent); - if (!sublist.isEmpty()) - { - _log.info("creating {} projects in merge", sublist.size()); - Set fks = PageFlowUtil.set(FieldKey.fromString("displayName"), FieldKey.fromString("investigatorId/lastName"), FieldKey.fromString("investigatorId/firstName"), FieldKey.fromString("enddate")); - final Map cols = QueryService.get().getColumns(projects, fks); - - TableSelector projectTs = new TableSelector(projects, cols.values(), new SimpleFilter(FieldKey.fromString("displayName"), sublist, CompareType.IN), null); - projectTs.forEach(new Selector.ForEachBlock<>() - { - @Override - public void exec(ResultSet object) throws SQLException - { - Results rs = new ResultsImpl(object, cols); - String projectName = rs.getString(FieldKey.fromString("displayName")); - String lastName = rs.getString(FieldKey.fromString("investigatorId/lastName")); - Date enddate = rs.getDate(FieldKey.fromString("enddate")); - - RequestSyncHelper.createInsurance(mergeSchema, c, u, projectName, lastName, enddate); - } - }); - } - } - - //then find expired projects and update if needed - List expiredProjectNames = new TableSelector(projects, PageFlowUtil.set("displayName"), new SimpleFilter(FieldKey.fromString("enddateCoalesced"), new Date(), CompareType.DATE_LT), null).getArrayList(String.class); - start = 0; - while (start < expiredProjectNames.size()) - { - List sublist = expiredProjectNames.subList(start, Math.min(expiredProjectNames.size(), start + batchSize)); - start = start + batchSize; - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("INS_NAME"), sublist, CompareType.IN); - filter.addCondition(FieldKey.fromString("INS_TYPE"), "C", CompareType.NEQ_OR_NULL); - List insuranceToUpdate = new TableSelector(insurance, PageFlowUtil.set("INS_INDEX"), filter, null).getArrayList(Integer.class); - if (!insuranceToUpdate.isEmpty()) - { - _log.info("marking {} projects inactive in merge", insuranceToUpdate.size()); - for (Integer index : insuranceToUpdate) - { - SQLFragment sql = new SQLFragment("UPDATE dbo.insurance SET INS_TYPE = 'C', INS_ADDR1 = (INS_ADDR1 + ' ' + '(Expired)') WHERE INS_INDEX = ?", index); - new SqlExecutor(mergeSchema).execute(sql); - } - } - } - } - - private Integer resolveProject(Container c, User u, String projectName) - { - if (_cachedProjectNames.containsKey(projectName)) - { - return _cachedProjectNames.get(projectName); - } - - if ("CLINIC".equals(projectName) || "PATHOLOGY".equals(projectName) || "SURGERY".equals(projectName)) - { - projectName = EHRService.get().getEHRDefaultClinicalProjectName(c); - } - - TableInfo ti = QueryService.get().getUserSchema(u, c, "ehr").getTable("project"); - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("displayName"), projectName); - TableSelector ts = new TableSelector(ti, Collections.singleton("project"), filter, null); - List results = ts.getArrayList(Integer.class); - Integer ret = results.isEmpty() ? null : results.getFirst(); - _cachedProjectNames.put(projectName, ret); - - return ret; - } -} diff --git a/mergesync/src/org/labkey/mergesync/MergeSyncSchema.java b/mergesync/src/org/labkey/mergesync/MergeSyncSchema.java deleted file mode 100644 index bf19a07dc..000000000 --- a/mergesync/src/org/labkey/mergesync/MergeSyncSchema.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ - -package org.labkey.mergesync; - -import org.labkey.api.data.DbSchema; -import org.labkey.api.data.dialect.SqlDialect; - -public class MergeSyncSchema -{ - public static final String NAME = "mergesync"; - private static final MergeSyncSchema _instance = new MergeSyncSchema(); - - public static MergeSyncSchema getInstance() - { - return _instance; - } - - private MergeSyncSchema() - { - - } - - public DbSchema getSchema() - { - return DbSchema.get(NAME); - } - - public SqlDialect getSqlDialect() - { - return getSchema().getSqlDialect(); - } -} diff --git a/mergesync/src/org/labkey/mergesync/MergeSyncTableCustomizer.java b/mergesync/src/org/labkey/mergesync/MergeSyncTableCustomizer.java deleted file mode 100644 index 9710f27f6..000000000 --- a/mergesync/src/org/labkey/mergesync/MergeSyncTableCustomizer.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ -package org.labkey.mergesync; - -import org.labkey.api.data.AbstractTableInfo; -import org.labkey.api.data.TableInfo; -import org.labkey.api.data.WrappedColumn; -import org.labkey.api.ldk.table.AbstractTableCustomizer; -import org.labkey.api.module.ModuleLoader; -import org.labkey.api.query.LookupForeignKey; -import org.labkey.api.query.UserSchema; - -/** - - */ -public class MergeSyncTableCustomizer extends AbstractTableCustomizer -{ - public MergeSyncTableCustomizer() - { - - } - - @Override - public void customize(TableInfo ti) - { - if (ti instanceof AbstractTableInfo && (matches(ti, "study", "Clinpath Runs") || matches(ti, "study", "clinpathRuns"))) - { - customizeClinpathRuns((AbstractTableInfo)ti); - } - } - - private void customizeClinpathRuns(AbstractTableInfo ti) - { - if (ti.getUserSchema().getContainer().getActiveModules().contains(ModuleLoader.getInstance().getModule(MergeSyncModule.NAME))) - { - String name = "mergeSyncInfo"; - if (ti.getColumn(name) == null && ti.getColumn("servicerequested") != null) - { - final UserSchema us = getUserSchema(ti, MergeSyncSchema.NAME); - WrappedColumn ci = new WrappedColumn(ti.getColumn("servicerequested"), name); - LookupForeignKey fk = new LookupForeignKey() - { - @Override - public TableInfo getLookupTableInfo() - { - return us.getTable(MergeSyncManager.TABLE_TESTNAMEMAPPING); - } - }; - - ci.setFk(fk); - ci.setUserEditable(false); - ci.setIsUnselectable(true); - ci.setLabel("Merge Sync Info"); - ti.addColumn(ci); - } - } - } -} diff --git a/mergesync/src/org/labkey/mergesync/MergeSyncUserSchema.java b/mergesync/src/org/labkey/mergesync/MergeSyncUserSchema.java deleted file mode 100644 index bedb69370..000000000 --- a/mergesync/src/org/labkey/mergesync/MergeSyncUserSchema.java +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ -package org.labkey.mergesync; - -import org.jetbrains.annotations.NotNull; -import org.labkey.api.collections.CaseInsensitiveTreeSet; -import org.labkey.api.data.Container; -import org.labkey.api.data.ContainerFilter; -import org.labkey.api.data.DbSchema; -import org.labkey.api.data.JdbcType; -import org.labkey.api.data.SQLFragment; -import org.labkey.api.data.TableInfo; -import org.labkey.api.data.VirtualTable; -import org.labkey.api.module.Module; -import org.labkey.api.query.DefaultSchema; -import org.labkey.api.query.ExprColumn; -import org.labkey.api.query.QuerySchema; -import org.labkey.api.query.SimpleUserSchema; -import org.labkey.api.security.User; - -import java.util.Collections; -import java.util.Set; - -/** - - */ -public class MergeSyncUserSchema extends SimpleUserSchema -{ - public static final String TABLE_MERGE_RESULTS = "merge_results"; - public static final String TABLE_MERGE_RUNS = "merge_runs"; - - private MergeSyncUserSchema(User user, Container container, DbSchema schema) - { - super(MergeSyncSchema.NAME, null, user, container, schema); - } - - public static void register(final Module m) - { - final DbSchema dbSchema = DbSchema.get(MergeSyncSchema.NAME); - - DefaultSchema.registerProvider(MergeSyncSchema.NAME, new DefaultSchema.SchemaProvider(m) - { - @Override - public QuerySchema createSchema(final DefaultSchema schema, Module module) - { - return new MergeSyncUserSchema(schema.getUser(), schema.getContainer(), dbSchema); - } - }); - } - - @Override - public Set getTableNames() - { - Set ret = new CaseInsensitiveTreeSet(); - ret.addAll(super.getTableNames()); - ret.add(TABLE_MERGE_RESULTS); - ret.add(TABLE_MERGE_RUNS); - - return Collections.unmodifiableSet(ret); - } - - @Override - public Set getVisibleTableNames() - { - return getTableNames(); - } - - @Override - public TableInfo createTable(String name, ContainerFilter cf) - { - if (TABLE_MERGE_RESULTS.equalsIgnoreCase(name)) - { - DbSchema schema = MergeSyncManager.get().getMergeSchema(); - if (schema != null) - return getMergeDataTable(schema, cf); - } - else if (TABLE_MERGE_RUNS.equalsIgnoreCase(name)) - { - DbSchema schema = MergeSyncManager.get().getMergeSchema(); - if (schema != null) - return getMergeRunsTable(schema, cf); - } - - return super.createTable(name, cf); - } - - public static TableInfo getMergeDataTable(DbSchema schema, ContainerFilter cf) - { - return new VirtualTable(schema, TABLE_MERGE_RESULTS, null, cf) - { - { - setTitle("Merge Raw Result Data"); - setupColumns(); - } - - @NotNull - @Override - public SQLFragment getFromSQL() - { - SQLFragment ret = new SQLFragment(); - ret.append("select\n"); - ret.append("r.RE_FINAL as isFinal,\n"); - ret.append("t.TS_Stat as status,\n"); - - //is this needed? it doesnt seem to connect back to a user name. USERS has very generic names - //if there a differnet field holding user name? - //--o.O_DOCTOR as orderedby, - - ret.append("o.O_ACCNUM as accession,\n"); - ret.append("t.TS_INDEX as panelId,\n"); - ret.append("p.Pt_Lname as animalId,\n"); - ret.append("IsNumeric(p.Pt_Lname) as numericLastName,\n"); - //ret.append(MergeSyncUserSchema.getDateConversionSql("r.RE_DATE", "r.RE_TZ") + " as date,\n"); - // ret.append(MergeSyncUserSchema.getDateConversionSql("t.TS_VDT", "t.TS_VTZ") + " as dateVerified,\n"); - ret.append("i.INS_NAME as project,\n"); - ret.append(MergeSyncUserSchema.getDateConversionSql("o.O_COLLDT", "o.O_CLTZ") + " as dateCollected,\n"); - ret.append(MergeSyncUserSchema.getDateConversionSql("o.O_DATE", "o.O_DTZ") + " as dateOrdered,\n"); - - //Added new column 3-24-2016 R. Blasa - ret.append(MergeSyncUserSchema.getDateConversionSql("t.TS_VDT", "t.TS_VTZ") + " as date,\n"); - ret.append(MergeSyncUserSchema.getDateConversionSql("t.TS_VDT", "t.TS_VTZ") + " as dateVerified,\n"); - - //ret.append(MergeSyncUserSchema.getDateConversionSql("r.RE_DATE", "r.RE_TZ") + " as runDate,\n"); - - //Added new column 3-24-2016 R. Blasa - ret.append(MergeSyncUserSchema.getDateConversionSql("t.TS_VDT", "t.TS_VTZ") + " as runDate,\n"); - - ret.append("ti.T_ABBR as servicename_abbr,\n"); - ret.append("ti.T_NAME as servicename,\n"); - ret.append("pr.PR_LOGIN as doctorLogin,\n"); - ret.append("pr.PR_LNAME as doctorLastName,\n"); - ret.append("pr.PR_FNAME as doctorFirstName,\n"); - ret.append("tech.PR_LOGIN as techLogin,\n"); - ret.append("tech.PR_LNAME as techLastName,\n"); - ret.append("tech.PR_FNAME as techFirstName,\n"); - - ret.append("rs.RT_ABBR as testId_abbr,\n"); - ret.append("rs.RT_RDSCR as testId,\n"); - ret.append("r.re_data as text_result,\n"); - ret.append("r.RE_FLVAL as numeric_result,\n"); - ret.append("r.re_Text as remark,\n"); - ret.append("cm.RSC_COMMENT as runRemark,\n"); - ret.append("(SELECT max(r.re_data) as expr\n"); - ret.append("FROM results r \n"); - ret.append("LEFT JOIN RSLTTYP rs ON (rs.RT_RIDX = r.RE_RIDX)\n"); - ret.append("WHERE r.RE_ACCNR = o.O_ACCNUM\n"); - ret.append("AND r.RE_TIDX = t.TS_INDEX\n"); - ret.append("AND rs.RT_ABBR = 'COM 1:'\n"); - ret.append("AND r.re_data IS NOT NULL\n"); - ret.append("AND r.re_data != ''\n"); - ret.append(") as runComment\n"); - - //one row per batch of orders - ret.append("FROM Orders o\n"); - - //many panels could be ordered at a time - //TODO: what about failures and repeats? - ret.append("LEFT JOIN tests t ON (t.TS_ACCNR = o.O_ACCNUM)\n"); - - //contains reference info about that panel - ret.append("LEFT JOIN TESTINFO ti ON (ti.T_TSTNUM = t.TS_TNUM)\n"); - - //there will usually be many results per panel - ret.append("LEFT JOIN results r ON (\n"); - ret.append("r.RE_ACCNR = o.O_ACCNUM\n"); - ret.append("AND r.RE_TIDX = t.TS_INDEX\n"); - //ret.append("--AND o.O_ptnum = r.re_ptnum\n"); - ret.append(")\n"); - - //translate test name - ret.append("LEFT JOIN RSLTTYP rs ON (rs.RT_RIDX = r.RE_RIDX)\n"); - - //append result comment. is this guaranteed 1:1 with results?? - ret.append("left join RESULT_COMMENTS cm on (\n"); - ret.append("cm.RSC_ACCNR = r.RE_ACCNR\n"); - ret.append("and cm.RSC_RIDX = r.RE_RIDX\n"); - ret.append("and cm.RSC_COMMENT != '>^'\n"); //this might mean something - ret.append("and cm.RSC_COMMENT != '<^'\n"); //this might mean something - ret.append(")\n"); - - //there should only be 1 patient per order - ret.append("LEFT JOIN patients p ON (\n"); - ret.append("o.O_PTNUM = p.PT_NUM\n"); - - ret.append(")\n"); - - ret.append("LEFT JOIN PRSNL pr ON (o.O_DOCTOR = pr.pr_num)\n"); - ret.append("LEFT JOIN PRSNL tech ON (o.O_EPRSN = tech.pr_num)\n"); - - //there should only be 1 visit per order - ret.append("LEFT JOIN VISITS v ON (o.O_VID = v.V_ID)\n"); - - //join to visit/insurance - ret.append("LEFT JOIN Vis_Ins vi ON (vi.VINS_VID = v.V_ID)\n"); - - //join to insurance for project - ret.append("left join INSURANCE i ON (i.INS_INDEX = vi.VINS_INS1)\n"); - ret.append("WHERE rs.RT_ABBR != 'COM 1:'\n"); - return ret; - } - - protected void setupColumns() - { - addColumn(new ExprColumn(this, "accession", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".accession"), JdbcType.INTEGER)); - addColumn(new ExprColumn(this, "panelId", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".panelId"), JdbcType.INTEGER)); - addColumn(new ExprColumn(this, "animalId", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".animalId"), JdbcType.VARCHAR)); - var verifyDateCol = addColumn(new ExprColumn(this, "dateVerified", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".dateVerified"), JdbcType.TIMESTAMP)); - verifyDateCol.setFormat("yyyy-MM-dd HH:mm"); - - var dateCol = addColumn(new ExprColumn(this, "date", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".date"), JdbcType.TIMESTAMP)); - dateCol.setFormat("yyyy-MM-dd HH:mm"); - - addColumn(new ExprColumn(this, "projectName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".project"), JdbcType.VARCHAR)); - var dateCollectedCol = addColumn(new ExprColumn(this, "dateCollected", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".dateCollected"), JdbcType.TIMESTAMP)); - dateCollectedCol.setFormat("yyyy-MM-dd HH:mm"); - - var dateOrderedCol = addColumn(new ExprColumn(this, "dateOrdered", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".dateCollected"), JdbcType.TIMESTAMP)); - dateOrderedCol.setFormat("yyyy-MM-dd HH:mm"); - - addColumn(new ExprColumn(this, "runDate", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".runDate"), JdbcType.TIMESTAMP)); - addColumn(new ExprColumn(this, "servicename_abbr", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".servicename_abbr"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "doctorLogin", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".doctorLogin"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "doctorLastName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".doctorLastName"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "doctorFirstName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".doctorFirstName"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "techLogin", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".techLogin"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "techLastName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".techLastName"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "techFirstName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".techFirstName"), JdbcType.VARCHAR)); - - addColumn(new ExprColumn(this, "testId_abbr", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".testId_abbr"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "testId", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".testId"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "text_result", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".text_result"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "numeric_result", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".numeric_result"), JdbcType.DOUBLE)); - addColumn(new ExprColumn(this, "remark", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".remark"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "runRemark", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".runRemark"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "runComment", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".runComment"), JdbcType.VARCHAR)); - - addColumn(new ExprColumn(this, "isFinal", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".isFinal"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "status", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".status"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "numericLastName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".numericLastName"), JdbcType.BOOLEAN)); - } - }; - } - - public static TableInfo getMergeRunsTable(DbSchema schema, ContainerFilter cf) - { - return new VirtualTable(schema, TABLE_MERGE_RUNS, null, cf) - { - { - setTitle("Merge Run Data"); - setupColumns(); - } - - @NotNull - @Override - public SQLFragment getFromSQL() - { - SQLFragment ret = new SQLFragment(); - ret.append("select\n"); - ret.append(getSqlDialect().concatenate("CAST(o.O_ACCNUM as varchar)", "'<>'", "cast(t.TS_INDEX as varchar)")); - ret.append(" as pk,\n"); - - ret.append("t.TS_Stat as status,\n"); - - ret.append("o.O_ACCNUM as accession,\n"); - ret.append("t.TS_INDEX as panelId,\n"); - ret.append("p.Pt_Lname as animalId,\n"); - ret.append("IsNumeric(p.Pt_Lname) as numericLastName,\n"); - ret.append(MergeSyncUserSchema.getDateConversionSql("t.TS_VDT", "t.TS_VTZ") + " as date,\n"); - ret.append(MergeSyncUserSchema.getDateConversionSql("t.TS_VDT", "t.TS_VTZ") + " as dateVerified,\n"); - ret.append("i.INS_NAME as project,\n"); - ret.append(MergeSyncUserSchema.getDateConversionSql("o.O_COLLDT", "o.O_CLTZ") + " as dateCollected,\n"); - ret.append(MergeSyncUserSchema.getDateConversionSql("o.O_DATE", "o.O_DTZ") + " as dateOrdered,\n"); - ret.append("ti.T_ABBR as servicename_abbr,\n"); - ret.append("ti.T_NAME as servicename,\n"); - ret.append("pr.PR_LOGIN as doctorLogin,\n"); - ret.append("pr.PR_LNAME as doctorLastName,\n"); - ret.append("pr.PR_FNAME as doctorFirstName,\n"); - - ret.append("tech.PR_LOGIN as techLogin,\n"); - ret.append("tech.PR_LNAME as techLastName,\n"); - ret.append("tech.PR_FNAME as techFirstName,\n"); - ret.append("(SELECT max(r.re_data) as expr\n"); - ret.append("FROM results r \n"); - ret.append("LEFT JOIN RSLTTYP rs ON (rs.RT_RIDX = r.RE_RIDX)\n"); - ret.append("WHERE r.RE_ACCNR = o.O_ACCNUM\n"); - ret.append("AND r.RE_TIDX = t.TS_INDEX\n"); - ret.append("AND rs.RT_ABBR = 'COM 1:'\n"); - ret.append("AND r.re_data IS NOT NULL\n"); - ret.append("AND r.re_data != ''\n"); - ret.append(") as runRemark\n"); - - //one row per batch of orders - ret.append("FROM Orders o\n"); - - //many panels could be ordered at a time - ret.append("LEFT JOIN tests t ON (t.TS_ACCNR = o.O_ACCNUM)\n"); - - //contains reference info about that panel - ret.append("LEFT JOIN TESTINFO ti ON (ti.T_TSTNUM = t.TS_TNUM)\n"); - - //there should only be 1 patient per order - ret.append("LEFT JOIN patients p ON (\n"); - ret.append("o.O_PTNUM = p.PT_NUM\n"); - ret.append(")\n"); - - ret.append("LEFT JOIN PRSNL pr ON (o.O_DOCTOR = pr.pr_num)\n"); - ret.append("LEFT JOIN PRSNL tech ON (o.O_EPRSN = tech.pr_num)\n"); - - //there should only be 1 visit per order - ret.append("LEFT JOIN VISITS v ON (o.O_VID = v.V_ID)\n"); - - //join to visit/insurance - ret.append("LEFT JOIN Vis_Ins vi ON (vi.VINS_VID = v.V_ID)\n"); - - //join to insurance for project - ret.append("left join INSURANCE i ON (i.INS_INDEX = vi.VINS_INS1)\n"); - - return ret; - } - - protected void setupColumns() - { - addColumn(new ExprColumn(this, "accession", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".accession"), JdbcType.INTEGER)); - addColumn(new ExprColumn(this, "panelId", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".panelId"), JdbcType.INTEGER)); - addColumn(new ExprColumn(this, "animalId", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".animalId"), JdbcType.VARCHAR)); - var verifyDateCol = addColumn(new ExprColumn(this, "dateVerified", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".dateVerified"), JdbcType.TIMESTAMP)); - verifyDateCol.setFormat("yyyy-MM-dd HH:mm"); - - var dateCol = addColumn(new ExprColumn(this, "date", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".date"), JdbcType.TIMESTAMP)); - dateCol.setFormat("yyyy-MM-dd HH:mm"); - - addColumn(new ExprColumn(this, "projectName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".project"), JdbcType.VARCHAR)); - var dateCollectedCol = addColumn(new ExprColumn(this, "dateCollected", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".dateCollected"), JdbcType.TIMESTAMP)); - dateCollectedCol.setFormat("yyyy-MM-dd HH:mm"); - - var dateOrderedCol = addColumn(new ExprColumn(this, "dateOrdered", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".dateCollected"), JdbcType.TIMESTAMP)); - dateOrderedCol.setFormat("yyyy-MM-dd HH:mm"); - - addColumn(new ExprColumn(this, "servicename_abbr", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".servicename_abbr"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "doctorLogin", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".doctorLogin"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "doctorLastName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".doctorLastName"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "doctorFirstName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".doctorFirstName"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "techLogin", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".techLogin"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "techLastName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".techLastName"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "techFirstName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".techFirstName"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "status", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".status"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "pk", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".pk"), JdbcType.VARCHAR)); - addColumn(new ExprColumn(this, "numericLastName", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".numericLastName"), JdbcType.BOOLEAN)); - addColumn(new ExprColumn(this, "runRemark", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".runRemark"), JdbcType.VARCHAR)); - - getMutableColumn("pk").setKeyField(true); - } - }; - } - - private static String getDateConversionSql(String colName, String tzColName) - { - //i dont know why merge doesnt store these offsets with the correct sign... - return "DATEADD(mi, (SELECT -1 * tz.TZ_OFFSET FROM TIMEZONES tz WHERE tz.ROWID = " + tzColName + "), " + colName + ")"; - } -} diff --git a/mergesync/src/org/labkey/mergesync/RequestSyncHelper.java b/mergesync/src/org/labkey/mergesync/RequestSyncHelper.java deleted file mode 100644 index cd79541b4..000000000 --- a/mergesync/src/org/labkey/mergesync/RequestSyncHelper.java +++ /dev/null @@ -1,740 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ -package org.labkey.mergesync; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.DateUtils; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; -import org.labkey.api.collections.CaseInsensitiveHashMap; -import org.labkey.api.data.ColumnInfo; -import org.labkey.api.data.CompareType; -import org.labkey.api.data.Container; -import org.labkey.api.data.ContainerManager; -import org.labkey.api.data.DbSchema; -import org.labkey.api.data.DbScope; -import org.labkey.api.data.Results; -import org.labkey.api.data.SQLFragment; -import org.labkey.api.data.Selector; -import org.labkey.api.data.SimpleFilter; -import org.labkey.api.data.SqlExecutor; -import org.labkey.api.data.SqlSelector; -import org.labkey.api.data.Table; -import org.labkey.api.data.TableInfo; -import org.labkey.api.data.TableSelector; -import org.labkey.api.ehr.EHRDemographicsService; -import org.labkey.api.ehr.demographics.AnimalRecord; -import org.labkey.api.query.FieldKey; -import org.labkey.api.query.QueryService; -import org.labkey.api.security.User; -import org.labkey.api.security.UserManager; -import org.labkey.api.util.GUID; -import org.labkey.api.util.JobRunner; -import org.labkey.api.util.PageFlowUtil; -import org.labkey.api.util.Pair; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TimeZone; - -/** - * Syncs requests made in LK (ie. records from study.clinpathRuns) to merge. - * Primarily called through trigger scripts - */ -public class RequestSyncHelper -{ - private static final Logger _log = LogManager.getLogger(RequestSyncHelper.class); - protected final static SimpleDateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - - private Container _container; - private User _user; - - public RequestSyncHelper(int userId, String containerId) - { - _user = UserManager.getUser(userId); - if (_user == null) - throw new RuntimeException("User does not exist: " + userId); - - _container = ContainerManager.getForId(containerId); - if (_container == null) - throw new RuntimeException("Container does not exist: " + containerId); - } - - public void asyncRequests(final Map[] rows) - { - if (!MergeSyncManager.get().isPushEnabled()) - { - _log.info("Merge push not enabled, skipping"); - return; - } - - JobRunner.getDefault().execute(new Runnable(){ - @Override - public void run() - { - doSyncRequest(Arrays.asList(rows)); - } - }); - } - - public void doSyncRequest(Collection rows) - { - if (!MergeSyncManager.get().isPushEnabled()) - { - _log.info("Merge push not enabled, skipping"); - return; - } - - MergeSyncManager.get().validateSettings(); - - DbSchema mergeSchema = MergeSyncManager.get().getMergeSchema(); - if (mergeSchema == null) - { - _log.error("Unable to find merge schema"); - return; - } - - Map>> recordsToSync = new HashMap<>(); - for (Map row : rows) - { - String animalId = (String)row.get("Id"); - Date date = (Date)row.get("date"); - String servicerequested = (String)row.get("servicerequested"); - String objectId = (String)row.get("objectid"); - String taskid = (String)row.get("taskid"); - String requestid = (String)row.get("requestid"); - String key = (taskid == null ? "" : taskid) + "<>" + (requestid == null ? "" : requestid) + "<>" + animalId + "<>" + _dateFormat.format(date); - - if (servicerequested == null || !shouldSyncService(servicerequested)) - { - _log.info("No mapping for service: {}, skipping", servicerequested); - return; - } - - _log.info("Syncing single request to merge for animal: {}", animalId); - - if (hasBeenOrdered(_container, objectId)) - { - _log.error("Request has already been synced: {}", objectId); - continue; - } - - List> list = recordsToSync.get(key); - if (list == null) - list = new ArrayList<>(); - - list.add(new CaseInsensitiveHashMap(row)); - - recordsToSync.put(key, list); - } - - if (recordsToSync.isEmpty()) - { - return; - } - - DbScope scope = mergeSchema.getScope(); - try (DbScope.Transaction transaction = scope.ensureTransaction()) - { - _log.info("Syncing requests to merge: {}", recordsToSync.size()); - for (String key : recordsToSync.keySet()) - { - List> records = recordsToSync.get(key); - String[] tokens = key.split("<>"); - String taskId = StringUtils.trimToNull(tokens[0]); - String requestId = StringUtils.trimToNull(tokens[1]); - - //create 1 record per batch of tests - String patientId = createPatientIfNeeded(mergeSchema, _container, _user, (String)records.getFirst().get("Id")); - Integer doctorId = getMergeUserId(mergeSchema, _user, "DOC"); - Integer techId = getMergeUserId(mergeSchema, _user, "TECH"); - if (doctorId == null) - { - _log.error("Unable to resolve merge user id for: {} with role: DOC", _user.getEmail()); - return; - } - - if (techId == null) - { - _log.error("Unable to resolve merge user id for: {} with role: TECH", _user.getEmail()); - return; - } - - Integer insuranceId = createInsuranceIfNeeded(mergeSchema, _container, _user, (Integer)records.getFirst().get("project")); - String visitId = createVisit(mergeSchema, _user, patientId, doctorId, techId, insuranceId, (Date)records.getFirst().get("date")); - createCopyTo(mergeSchema, _user, patientId, doctorId, techId, visitId); - int orderId = createOrder(mergeSchema, _user, patientId, doctorId, techId, visitId, (Date)records.getFirst().get("date")); - - //then 1 row per service type (clinpath runs record) - int letterIdx = 0; - for (Map row : records) - { - Integer mergeTestId = resolveMergeTestId(mergeSchema, (String)row.get("servicerequested")); - if (mergeTestId == null) - { - _log.error("Unable to find merge test name matching: {}", row.get("servicerequested")); - continue; - } - - //TODO: figure out what scheme to use to batch tests by container - char containerName = ALPHABET[letterIdx]; - letterIdx++; - if (letterIdx > 25) - { - _log.error("More than 26 containers were used for a merge import. Restarting at A"); - } - letterIdx = letterIdx % 26; - - int containerId = createContainer(mergeSchema, _user, orderId, mergeTestId, doctorId, techId, (Date)records.getFirst().get("date"), containerName); - int testId = createTest(mergeSchema, _user, patientId, visitId, orderId, containerId, mergeTestId, (Date)row.get("date"), containerName); - - //insert record into orderssynced - TableInfo ordersSynced = MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_ORDERSSYNCED); - CaseInsensitiveHashMap toInsert = new CaseInsensitiveHashMap<>(); - toInsert.put("objectid", new GUID().toString()); - toInsert.put("runid", row.get("objectid")); - toInsert.put("order_accession", orderId); - toInsert.put("test_accession", testId); - toInsert.put("container", _container.getId()); - toInsert.put("createdby", _user.getUserId()); - toInsert.put("merge_datecreated", new Date()); - toInsert.put("created", new Date()); - toInsert.put("taskid", taskId); - toInsert.put("requestid", requestId); - toInsert.put("resultsreceived", false); - Table.insert(_user, ordersSynced, toInsert); - } - - _log.info("created merge order: {}, with {} tests", orderId, records.size()); - } - - transaction.commit(); - _log.info("Finished syncing requests to merge"); - } - catch (SQLException e) - { - _log.error(e.getMessage(), e); - } - } - - private boolean shouldSyncService(String servicename) - { - TableInfo testMapping = MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_TESTNAMEMAPPING); - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("servicename"), servicename, CompareType.EQUAL); - filter.addCondition(FieldKey.fromString("mergetestname"), null, CompareType.NONBLANK); - TableSelector ts = new TableSelector(testMapping, filter, null); - - return ts.exists(); - } - - private Integer resolveMergeTestId(DbSchema mergeSchema, String servicename) - { - if (servicename == null) - return null; - - TableInfo testMapping = MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_TESTNAMEMAPPING); - TableSelector ts = new TableSelector(testMapping, PageFlowUtil.set("mergetestname"), new SimpleFilter(FieldKey.fromString("servicename"), servicename, CompareType.EQUAL), null); - List ret = ts.getArrayList(String.class); - if (ret.isEmpty()) - return null; - - TableInfo mergeTestNames = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_TESTINFO); - TableSelector ts2 = new TableSelector(mergeTestNames, PageFlowUtil.set("T_TSTNUM"), new SimpleFilter(FieldKey.fromString("T_ABBR"), ret.getFirst(), CompareType.EQUAL), null); - List ret2 = ts2.getArrayList(Integer.class); - - return ret2.isEmpty() ? null : ret2.getFirst(); - } - - private Map getMergeTestInfo(DbSchema mergeSchema, int mergeTestId) - { - TableInfo mergeTestNames = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_TESTINFO); - TableSelector ts = new TableSelector(mergeTestNames, PageFlowUtil.set("T_PARTOF", "T_TYPE", "T_COLLTB"), new SimpleFilter(FieldKey.fromString("T_TSTNUM"), mergeTestId, CompareType.EQUAL), null); - Map ret = ts.getMap(); - - return ret; - } - - private boolean hasBeenOrdered(Container c, String objectid) - { - TableInfo ordersSynced = MergeSyncSchema.getInstance().getSchema().getTable(MergeSyncManager.TABLE_ORDERSSYNCED); - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("runid"), objectid, CompareType.EQUAL); - filter.addCondition(FieldKey.fromString("container"), c.getId(), CompareType.EQUAL); - TableSelector ts = new TableSelector(ordersSynced, filter, null); - - return ts.exists(); - } - - private String createPatientIfNeeded(DbSchema mergeSchema, Container c, User u, String animalId) throws SQLException - { - TableInfo ti = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_PATIENTS); - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("PT_LNAME"), animalId); - TableSelector ts = new TableSelector(ti, Collections.singleton("PT_NUM"), filter, null); - List existing = ts.getArrayList(String.class); - if (!existing.isEmpty()) - { - if (existing.size() > 1) - { - _log.error("More than 1 matching patient found: {}", animalId); - } - - return existing.getFirst(); - } - - return createPatient(mergeSchema, c, u, animalId); - } - - public static String createPatient(DbSchema mergeSchema, Container c, User u, String animalId) - { - TableInfo ti = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_PATIENTS); - - Map toInsert = new CaseInsensitiveHashMap<>(); - toInsert.put("PT_LNAME", animalId); - toInsert.put("PT_NUM", animalId); - - //increment index? - - AnimalRecord ar = EHRDemographicsService.get().getAnimal(c, animalId); - if (ar != null) - { - toInsert.put("PT_SEX", ar.getGender() == null ? null : ar.getGender().toUpperCase()); - toInsert.put("PT_DOB", ar.getBirth()); - String species = ar.getSpecies(); - String speciesCode = null; - if (species != null) - { - speciesCode = getSpeciesCode(species); - toInsert.put("PT_RACE", speciesCode); - } - - String firstName = speciesCode == null ? "" : "(" + speciesCode + ")"; - if (!"Alive".equals(ar.getCalculatedStatus())) - { - firstName += " *" + (ar.getCalculatedStatus() == null ? "Unknown" : ar.getCalculatedStatus()) + "*"; - } - else - { - firstName += " -"; - } - - toInsert.put("PT_FNAME", firstName); - } - - Map inserted = Table.insert(u, ti, toInsert); - - return (String)inserted.get("PT_NUM"); - } - - public static String getSpeciesCode(String species) - { - if (species == null) - return null; - - //first translate project Id into the name - TableInfo speciesTable = DbSchema.get("ehr_lookups").getTable("species"); - TableSelector ts = new TableSelector(speciesTable, PageFlowUtil.set("cites_code"), new SimpleFilter(FieldKey.fromString("common"), species), null); - List ret = ts.getArrayList(String.class); - - return ret != null && !ret.isEmpty() ? ret.getFirst() : null; - } - - private Integer createInsuranceIfNeeded(DbSchema mergeSchema, Container c, User u, Integer project) throws SQLException - { - if (project == null) - return null; - - //first translate project Id into the name - TableInfo projectTable = QueryService.get().getUserSchema(u, c, "ehr").getTable("project"); - if (projectTable == null) - { - _log.error("Unable to find ehr.project in container: {}", _container.getPath()); - return null; - } - - Set fks = PageFlowUtil.set(FieldKey.fromString("displayName"), FieldKey.fromString("investigatorId/lastName"), FieldKey.fromString("investigatorId/firstName"), FieldKey.fromString("enddate")); - final Map cols = QueryService.get().getColumns(projectTable, fks); - - TableSelector projectTs = new TableSelector(projectTable, cols.values(), new SimpleFilter(FieldKey.fromString("project"), project), null); - if (!projectTs.exists()) - { - _log.error("Unable to find project with Id: {} in container: {}", project, _container.getPath()); - return null; - } - - try (Results rs = projectTs.getResults()) - { - rs.next(); - String projectName = rs.getString(FieldKey.fromString("displayName")); - String lastName = rs.getString(FieldKey.fromString("investigatorId/lastName")); - Date enddate = rs.getDate(FieldKey.fromString("enddate")); - - TableInfo ti = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_INSURANCE); - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("INS_NAME"), projectName); - TableSelector ts = new TableSelector(ti, Collections.singleton("INS_INDEX"), filter, null); - List existing = ts.getArrayList(Integer.class); - if (!existing.isEmpty()) - { - if (existing.size() > 1) - { - _log.error("More than insurance found matching project: {}", project); - } - - return existing.getFirst(); - } - - return createInsurance(mergeSchema, c, u, projectName, lastName, enddate); - } - } - - public static Integer createInsurance(DbSchema mergeSchema, Container c, User u, String projectName, String lastName, Date enddate) - { - TableInfo ti = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_INSURANCE); - boolean isExpired = enddate == null ? false : DateUtils.truncate(enddate, Calendar.DATE).getTime() < DateUtils.truncate(new Date(), Calendar.DATE).getTime(); - - Map toInsert = new CaseInsensitiveHashMap<>(); - toInsert.put("INS_NAME", projectName + (isExpired ? " (Expired)" : "")); - toInsert.put("INS_ADDR1", lastName); - toInsert.put("INS_INDEX", getAndIncrementIndex("INS_INDEX", ti)); - toInsert.put("INS_PRINT_IP", "N"); - toInsert.put("INS_PRINT_OP", "N"); - toInsert.put("INS_TYPE", (isExpired ? "C" : "I")); - - Map inserted = Table.insert(u, ti, toInsert); - - return (Integer)inserted.get("INS_INDEX"); - } - - private static int getAndIncrementIndex(String colName, TableInfo ti) - { - SqlSelector ss = new SqlSelector(ti.getSchema(), new SQLFragment("SELECT COALESCE(NX_NUM, NX_MIN) as expr FROM Nextnum WHERE nx_Fldnm = ?", colName)); - List ret = ss.getArrayList(Integer.class); - if (ret.isEmpty()) - { - throw new RuntimeException("Unknown index: " + colName); - } - - Integer i = ret.getFirst(); - - //increment this index - SqlExecutor se = new SqlExecutor(ti.getSchema()); - se.execute(new SQLFragment("UPDATE Nextnum SET NX_NUM = (? + 1) WHERE nx_Fldnm = ?", i, colName)); - - return i; - } - - private Integer getMergeUserId(DbSchema mergeSchema, User u, String role) - { - TableInfo ti = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_PERSONNEL); - Integer mergeUserId = null; - - //make 3 attempts to find the user. first use login - String displayName = u.getEmail(); - if (displayName != null && displayName.contains("@")) - { - displayName = displayName.split("@")[0]; - } - - if (mergeUserId == null && displayName != null) - { - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("PR_LOGIN"), displayName, CompareType.EQUAL); - filter.addCondition(FieldKey.fromString("PR_CLASS"), role); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("PR_NUM"), filter, null); - List ret = ts.getArrayList(Integer.class); - if (ret != null && ret.size() == 1) - { - mergeUserId = ret.getFirst(); - } - } - - //by convention, doctor logins append an 'x' to the end of the login - if (mergeUserId == null && displayName != null && "DOC".equals(role)) - { - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("PR_LOGIN"), displayName + "x", CompareType.EQUAL); - filter.addCondition(FieldKey.fromString("PR_CLASS"), role); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("PR_NUM"), filter, null); - List ret = ts.getArrayList(Integer.class); - if (ret != null && ret.size() == 1) - { - mergeUserId = ret.getFirst(); - } - } - - //then first/lastname - if (mergeUserId == null && u.getLastName() != null && u.getFirstName() != null) - { - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("PR_FNAME"), u.getFirstName(), CompareType.EQUAL); - filter.addCondition(FieldKey.fromString("PR_FNAME"), u.getLastName()); - filter.addCondition(FieldKey.fromString("PR_CLASS"), role); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("PR_NUM"), filter, null); - List ret = ts.getArrayList(Integer.class); - if (ret != null && ret.size() == 1) - { - mergeUserId = ret.getFirst(); - } - } - - if (mergeUserId != null) - { - return mergeUserId; - } - - //finally default to a static username, defined in module properties - String mergeUserName = MergeSyncManager.get().getMergeUserName(); - if (mergeUserName == null) - { - _log.error("Merge user not configured, cannot push requests to merge"); - return null; - } - - //NOTE: if defaulting back to the default login, always use DOC role - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("PR_LOGIN"), mergeUserName, CompareType.EQUAL); - filter.addCondition(FieldKey.fromString("PR_CLASS"), "DOC"); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("PR_NUM"), filter, null); - List ret = ts.getArrayList(Integer.class); - - Integer i = ret == null || ret.isEmpty() ? null : ret.getFirst(); - if (i == null) - { - _log.error("Unable to find merge userId matching the login: {} with the role: DOC", mergeUserName); - } - - return i; - } - - private void createCopyTo(DbSchema mergeSchema, User u, String patientId, int doctorId, int techId, String visitId) - { - TableInfo ti = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_COPY_TO); - - Map toInsert = new CaseInsensitiveHashMap<>(); - toInsert.put("CO_PTNUM", patientId); - toInsert.put("CO_VID", visitId); - toInsert.put("CO_TYPE", "D"); - toInsert.put("CO_DOC", doctorId); - - Table.insert(u, ti, toInsert); - } - - private String createVisit(DbSchema mergeSchema, User u, String patientId, int doctorId, int techId, Integer insuranceId, Date date) - { - TableInfo ti = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_VISITS); - - Map toInsert = new CaseInsensitiveHashMap<>(); - toInsert.put("V_PTNUM", patientId); - toInsert.put("V_TYPE", "O"); - toInsert.put("V_IO", "o"); - toInsert.put("V_ADMDT", convertDate(date)); - toInsert.put("V_ADTZ", getTZ(date, mergeSchema)); - toInsert.put("V_WARD", "ONPRC"); - toInsert.put("V_EPRSN", techId); - toInsert.put("V_WORKCOMP", "N"); - - //find next value in the series - toInsert.put("V_ID", "V" + getAndIncrementIndex("V_ID", ti)); - - //v_disdt, v_ht, v_wt, v_icd1, v_icd2, v_icd3, v_icd4, v_billtype, v_client all null? - - - Map inserted = Table.insert(u, ti, toInsert); - String V_ID = (String)inserted.get("V_ID"); - - //also create V_INS record - TableInfo visInsTable = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_VISIT_INS); - Map insToInsert = new CaseInsensitiveHashMap<>(); - insToInsert.put("vins_vid", V_ID); - insToInsert.put("vins_ins1", insuranceId); - Table.insert(u, visInsTable, insToInsert); - - return V_ID; - } - - private Integer _timezone = null; - - private int getTZ(Date date, DbSchema mergeSchema) - { - if (_timezone == null) - { - TimeZone tz = Calendar.getInstance().getTimeZone(); - String abbr = tz.getDisplayName(tz.inDaylightTime(date), TimeZone.SHORT); - TableInfo ti = mergeSchema.getTable("TIMEZONES"); - TableSelector ts = new TableSelector(ti, Collections.singleton("rowid"), new SimpleFilter(FieldKey.fromString("TZ_ABBR"), abbr), null); - List ret = ts.getArrayList(Integer.class); - - if (ret.isEmpty()) - { - _log.error("Unable to find timezone matching: {}", abbr); - throw new RuntimeException("Unable to find timezone matching: " + abbr); - } - - _timezone = ret.getFirst(); - } - - return _timezone; - } - - private Date convertDate(Date d) - { - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - TimeZone zone = Calendar.getInstance().getTimeZone(); - cal.setTimeInMillis(d.getTime() - zone.getOffset(d.getTime())); - - return cal.getTime(); - } - - private final char[] ALPHABET = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; - - private int createContainer(DbSchema mergeSchema, User u, int orderId, int mergeTestId, int doctorId, int techId, Date date, Character containerName) - { - TableInfo containerTable = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_CONTAINERS); - Map testInfo = getMergeTestInfo(mergeSchema, mergeTestId); - - Map toInsert = new CaseInsensitiveHashMap<>(); - toInsert.put("CNT_INDEX", getAndIncrementIndex("CNT_INDEX", containerTable)); - toInsert.put("CNT_ACCNR", orderId); - - toInsert.put("CNT_MAP", containerName.toString()); - toInsert.put("CNT_STATUS", "C"); - toInsert.put("CNT_DATE", convertDate(date)); - toInsert.put("CNT_DTZ", getTZ(date, mergeSchema)); - toInsert.put("CNT_TECH", techId); - toInsert.put("CNT_LOC", null); - toInsert.put("CNT_CURRLOC", "ONP"); - toInsert.put("CNT_DESTLOC", "ONP"); - toInsert.put("CNT_TUID", testInfo.get("T_COLLTB")); - toInsert.put("CNT_LABMIC", "L"); - toInsert.put("CNT_DRAWLOC", "ONPRC"); - toInsert.put("CNT_DRAWDATE", convertDate(date)); - toInsert.put("CNT_DRTZ", getTZ(date, mergeSchema)); - toInsert.put("CNT_TYPE", "P"); - - Map inserted = Table.insert(u, containerTable, toInsert); - return (Integer)inserted.get("CNT_INDEX"); - } - - private int createOrder(DbSchema mergeSchema, User u, String patientId, int doctorId, int techId, String visitId, Date date) - { - TableInfo ti = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_ORDERS); - - Map toInsert = new CaseInsensitiveHashMap<>(); - toInsert.put("O_PTNUM", patientId); - toInsert.put("O_VID", visitId); - toInsert.put("O_STATUS", "C"); - toInsert.put("O_DATE", convertDate(date)); - toInsert.put("O_DTZ", getTZ(date, mergeSchema)); - toInsert.put("O_COLLDT", convertDate(date)); - toInsert.put("O_CLTZ", getTZ(date, mergeSchema)); - toInsert.put("O_CDT", convertDate(date)); - toInsert.put("O_CTZ", getTZ(date, mergeSchema)); - toInsert.put("O_RCVDT", convertDate(date)); - toInsert.put("O_RCVTZ", getTZ(date, mergeSchema)); - toInsert.put("O_PRIO", 50); - toInsert.put("O_RPTD", "N"); - toInsert.put("O_DOCTOR", doctorId); - toInsert.put("O_EPRSN", techId); - toInsert.put("O_FASTING", "N"); - toInsert.put("O_LOC", "ONP"); - toInsert.put("O_WARD", "ONPRC"); - toInsert.put("O_ACCNUM", getAndIncrementIndex("O_ACCNUM", ti)); - - Map inserted = Table.insert(u, ti, toInsert); - - return (Integer)inserted.get("O_ACCNUM"); - } - - private Pair getWorklistInfo(DbSchema mergeSchema, Integer mergeTestId) - { - SQLFragment sql = new SQLFragment("SELECT w.WK_WIDX, ws.W_DEPT FROM TESTINFO t " + - "left join dbo.WKSTTSTS w on (w.WK_TESTN = t.T_TSTNUM) " + - "left join WORKSTAT ws ON (w.WK_WIDX = ws.W_INDEX)" + - "where t.T_TSTNUM = ?", mergeTestId); - - SqlSelector ss = new SqlSelector(mergeSchema, sql); - final Pair pair = Pair.of(null, null); - ss.forEach(new Selector.ForEachBlock<>() - { - @Override - public void exec(ResultSet rs) throws SQLException - { - pair.first = rs.getInt("WK_WIDX"); - pair.second = rs.getString("W_DEPT"); - } - }); - - return pair; - } - - private int createTest(DbSchema mergeSchema, User u, String patientId, String visitId, int accession, int containerId, int mergeTestId, Date date, Character containerName) - { - TableInfo ti = mergeSchema.getTable(MergeSyncManager.TABLE_MERGE_TEST); - Map testInfo = getMergeTestInfo(mergeSchema, mergeTestId); - Pair worklistInfo = getWorklistInfo(mergeSchema, mergeTestId); - - Map toInsert = new CaseInsensitiveHashMap<>(); - toInsert.put("TS_TNUM", mergeTestId); - toInsert.put("TS_PLTNR", mergeTestId); - toInsert.put("TS_MASTR", testInfo.get("T_PARTOF")); - toInsert.put("TS_PTNUM", patientId); - toInsert.put("TS_VID", visitId); - toInsert.put("TS_ACCNR", accession); - toInsert.put("TS_DEPT", worklistInfo.second); - toInsert.put("TS_WKIDX", worklistInfo.first); - toInsert.put("TS_MAP", containerName.toString()); - toInsert.put("TS_STAT", "C"); - toInsert.put("TS_PRIO", 50); - toInsert.put("TS_EDT", convertDate(date)); - toInsert.put("TS_ETZ", getTZ(date, mergeSchema)); - toInsert.put("TS_COLDT", convertDate(date)); - toInsert.put("TS_CLTZ", getTZ(date, mergeSchema)); - toInsert.put("TS_FILLR", null); - toInsert.put("TS_STECH", null); - toInsert.put("TS_VTECH", null); - toInsert.put("TS_RMTRPT", null); - toInsert.put("TS_REFLEX", null); - toInsert.put("TS_DBID", null); - toInsert.put("TS_SYSTEM", null); - toInsert.put("TS_DNLOAD", null); - toInsert.put("TS_ICD", null); - toInsert.put("TS_MODS", null); - toInsert.put("TS_BILLTYPE", null); - toInsert.put("TS_REFFLABNO", null); - toInsert.put("TS_CHGXMT", null); - toInsert.put("TS_INDEX", getAndIncrementIndex("TS_INDEX", ti)); - - Map inserted = Table.insert(u, ti, toInsert); - - return (Integer)inserted.get("TS_INDEX"); - } - - public void deleteSyncRecords(String objectid) - { - if (objectid == null) - return; - - SQLFragment sql = new SQLFragment("UPDATE " + MergeSyncSchema.NAME + "." + MergeSyncManager.TABLE_ORDERSSYNCED + " SET deletedate = ? WHERE runid = ?", new Date(), objectid); - SqlExecutor se = new SqlExecutor(MergeSyncSchema.getInstance().getSchema()); - long deleted = se.execute(sql); - _log.info("deleted {} merge sync records following clinpath record delete", deleted); - } -} diff --git a/ogasync/build.gradle b/ogasync/build.gradle deleted file mode 100644 index b3a3c591a..000000000 --- a/ogasync/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2016-2026 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. - */ -import org.labkey.gradle.util.BuildUtils - -plugins { - id 'org.labkey.build.module' -} - -dependencies { - BuildUtils.addLabKeyDependency(project: project, config: "implementation", depProjectPath: ":server:modules:LabDevKitModules:LDK", depProjectConfig: "apiJarFile") - - BuildUtils.addLabKeyDependency(project: project, config: "modules", depProjectPath: ":server:modules:LabDevKitModules:LDK", depProjectConfig: "published", depExtension: "module") - BuildUtils.addLabKeyDependency(project: project, config: "modules", depProjectPath: ":server:modules:ehrModules:ehr", depProjectConfig: "published", depExtension: "module") - BuildUtils.addLabKeyDependency(project: project, config: "modules", depProjectPath: ":server:modules:onprcEHRModules:onprc_ehr", depProjectConfig: "published", depExtension: "module") -} diff --git a/ogasync/module.properties b/ogasync/module.properties deleted file mode 100644 index 6b5d55d87..000000000 --- a/ogasync/module.properties +++ /dev/null @@ -1,3 +0,0 @@ -ModuleClass: org.labkey.ogasync.OGASyncModule -SupportedDatabases: mssql -ManageVersion: false diff --git a/ogasync/resources/queries/oga/ZGMS_PRIM_ALL_V.query.xml b/ogasync/resources/queries/oga/ZGMS_PRIM_ALL_V.query.xml deleted file mode 100644 index 58b0d67d2..000000000 --- a/ogasync/resources/queries/oga/ZGMS_PRIM_ALL_V.query.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - OGA Data Feed - - - -
-
-
-
diff --git a/ogasync/resources/queries/oga/grantProjects.query.xml b/ogasync/resources/queries/oga/grantProjects.query.xml deleted file mode 100644 index 403229683..000000000 --- a/ogasync/resources/queries/oga/grantProjects.query.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - OGA Grant Projects - - - OGA Project Number - - - OGA Award Number - - - Agency Award Number - - - PI - - - PI Employee Number - true - - - Project Title - - - Active Alias - - - Project Status - - - Award Status - - -
-
-
-
diff --git a/ogasync/resources/queries/oga/grantProjects.sql b/ogasync/resources/queries/oga/grantProjects.sql deleted file mode 100644 index 7e9fde921..000000000 --- a/ogasync/resources/queries/oga/grantProjects.sql +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2013-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -SELECT -v.* - -FROM oga.ZGMS_PRIM_ALL_V v \ No newline at end of file diff --git a/ogasync/resources/queries/oga/grantProjects/.qview.xml b/ogasync/resources/queries/oga/grantProjects/.qview.xml deleted file mode 100644 index 574d5989d..000000000 --- a/ogasync/resources/queries/oga/grantProjects/.qview.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ogasync/resources/queries/oga/grantProjects/Active Projects.qview.xml b/ogasync/resources/queries/oga/grantProjects/Active Projects.qview.xml deleted file mode 100644 index 7a38d80ed..000000000 --- a/ogasync/resources/queries/oga/grantProjects/Active Projects.qview.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/ogasync/resources/queries/oga/grants.query.xml b/ogasync/resources/queries/oga/grants.query.xml deleted file mode 100644 index a3949b1f4..000000000 --- a/ogasync/resources/queries/oga/grants.query.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Grants - - - OGA Award Number - - - Agency Award Number - - - PI - - - PI Employee Number - true - - - Project Title - - - Active Alias - - - Award Status - - -
-
-
-
diff --git a/ogasync/resources/queries/oga/grants.sql b/ogasync/resources/queries/oga/grants.sql deleted file mode 100644 index 46d852726..000000000 --- a/ogasync/resources/queries/oga/grants.sql +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2013-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -SELECT - v.OGA_AWARD_NUMBER, - - count(distinct PI_EMP_NUM) as total_PI_EMP_NUM, - max(PI_EMP_NUM) as PI_EMP_NUM, - - count(distinct PROJECT_TITLE) as total_PROJECT_TITLE, - max(PROJECT_TITLE) as PROJECT_TITLE, - - count(distinct AWARD_STATUS) as total_AWARD_STATUS, - max(AWARD_STATUS) as AWARD_STATUS, - - count(distinct PI_EMP_NUM) as total_PI_EMP_NUM, - max(PI_EMP_NUM) as PI_EMP_NUM, - - -FROM oga.ZGMS_PRIM_ALL_V v -group by OGA_AWARD_NUMBER \ No newline at end of file diff --git a/ogasync/resources/views/begin.html b/ogasync/resources/views/begin.html deleted file mode 100644 index 0d78a9832..000000000 --- a/ogasync/resources/views/begin.html +++ /dev/null @@ -1,171 +0,0 @@ - - - -This page allows configuration of the OGA ETL. There can only be one instance of the ETL active per site at any time. Below are explanations for the config properties: -

- -
    -
  • - labkeyUser: A valid LabKey user, which should have admin permission in the target folder -
  • -
  • - labkeyContainer: The containerPath where the data will be saved -
  • -
  • - dataSourceName: The name of the data source, which should be defined in application.properties -
  • -
  • - schemaName: The name of the source schema -
  • -
  • - ogaQueryName: The name of the source table for OGA aliases -
  • -
  • - allQueryName: The name of the source table for all aliases -
  • -
  • - hourOfDay: The hour (0-23) when the sync should run. It will run once per day. -
  • -
-
\ No newline at end of file diff --git a/ogasync/resources/views/begin.view.xml b/ogasync/resources/views/begin.view.xml deleted file mode 100644 index 3c89d0328..000000000 --- a/ogasync/resources/views/begin.view.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ogasync/src/org/labkey/ogasync/OGASyncController.java b/ogasync/src/org/labkey/ogasync/OGASyncController.java deleted file mode 100644 index 757d1af07..000000000 --- a/ogasync/src/org/labkey/ogasync/OGASyncController.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 2013-2026 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. - */ - -package org.labkey.ogasync; - -import org.labkey.api.action.ApiResponse; -import org.labkey.api.action.ApiSimpleResponse; -import org.labkey.api.action.MutatingApiAction; -import org.labkey.api.action.ReadOnlyApiAction; -import org.labkey.api.action.SpringActionController; -import org.labkey.api.data.ContainerManager; -import org.labkey.api.data.PropertyManager; -import org.labkey.api.data.PropertyManager.WritablePropertyMap; -import org.labkey.api.security.RequiresPermission; -import org.labkey.api.security.ValidEmail; -import org.labkey.api.security.permissions.AdminPermission; -import org.labkey.api.util.JobRunner; -import org.springframework.validation.BindException; -import org.springframework.validation.Errors; - -import java.util.HashMap; -import java.util.Map; - -public class OGASyncController extends SpringActionController -{ - private static final DefaultActionResolver _actionResolver = new DefaultActionResolver(OGASyncController.class); - - public OGASyncController() - { - setActionResolver(_actionResolver); - } - - @RequiresPermission(AdminPermission.class) - public static class RunEtlAction extends MutatingApiAction - { - @Override - public ApiResponse execute(Object form, BindException errors) - { - try - { - JobRunner.getDefault().execute(() -> new OGASyncRunner().run()); - } - catch (Exception e) - { - errors.reject(ERROR_MSG, e.getMessage()); - return null; - } - - return new ApiSimpleResponse("success", true); - } - - @Override - public void validateForm(Object form, Errors errors) - { - try - { - OGASyncManager.get().validateSettings(); - } - catch (Exception e) - { - errors.reject(ERROR_MSG, e.getMessage()); - } - } - } - - @RequiresPermission(AdminPermission.class) - public static class SetEtlDetailsAction extends MutatingApiAction - { - @Override - public ApiResponse execute(EtlAdminForm form, BindException errors) - { - Map resultProperties = new HashMap<>(); - - WritablePropertyMap configMap = PropertyManager.getWritableProperties(OGASyncManager.CONFIG_PROPERTY_DOMAIN, true); - - if (form.getLabkeyUser() != null) - { - try - { - new ValidEmail(form.getLabkeyUser()); - } - catch (ValidEmail.InvalidEmailException e) - { - errors.reject(ERROR_MSG, "Invalid email: " + e.getMessage()); - return null; - } - - configMap.put(OGASyncManager.LABKEY_USER_PROP_NAME, form.getLabkeyUser()); - } - - if (form.getLabkeyContainer() != null) - { - if (ContainerManager.getForPath(form.getLabkeyContainer()) == null) - { - errors.reject(ERROR_MSG, "Invalid container: " + form.getLabkeyContainer()); - return null; - } - - configMap.put(OGASyncManager.LABKEY_CONTAINER_PROP_NAME, form.getLabkeyContainer()); - } - - configMap.put(OGASyncManager.DATA_SOURCE_PROP_NAME, form.getDataSourceName()); - configMap.put(OGASyncManager.SCHEMA_PROP_NAME, form.getSchemaName()); - configMap.put(OGASyncManager.OGA_QUERY_PROP_NAME, form.getOgaQueryName()); - configMap.put(OGASyncManager.ALL_QUERY_PROP_NAME, form.getAllQueryName()); - - if (form.getHourOfDay() != null) - { - if (form.getHourOfDay() > 23 || form.getHourOfDay() < -1) - { - errors.reject(ERROR_MSG, "Hour of day must be between 0-23"); - return null; - } - - configMap.put(OGASyncManager.HOUR_PROP_NAME, form.getHourOfDay().toString()); - } - - if (form.getEtlStatus() != null) - configMap.put(OGASyncManager.ENABLED_PROP_NAME, form.getEtlStatus().toString()); - - configMap.save(); - - //if config was changed and the ETL is current scheduled to run, we need to restart it - OGASyncManager.get().onSettingsChange(); - - resultProperties.put("success", true); - - return new ApiSimpleResponse(resultProperties); - } - } - - public static class EtlAdminForm - { - private Boolean _etlStatus; - private String _labkeyUser; - private String _labkeyContainer; - private Integer _hourOfDay; - private String _dataSourceName; - private String _schemaName; - private String _ogaQueryName; - private String _allQueryName; - - public Boolean getEtlStatus() - { - return _etlStatus; - } - - public void setEtlStatus(Boolean etlStatus) - { - _etlStatus = etlStatus; - } - - public String getLabkeyUser() - { - return _labkeyUser; - } - - public void setLabkeyUser(String labkeyUser) - { - _labkeyUser = labkeyUser; - } - - public String getLabkeyContainer() - { - return _labkeyContainer; - } - - public void setLabkeyContainer(String labkeyContainer) - { - _labkeyContainer = labkeyContainer; - } - - public Integer getHourOfDay() - { - return _hourOfDay; - } - - public void setHourOfDay(Integer hourOfDay) - { - _hourOfDay = hourOfDay; - } - - public String getDataSourceName() - { - return _dataSourceName; - } - - public void setDataSourceName(String dataSourceName) - { - _dataSourceName = dataSourceName; - } - - public String getSchemaName() - { - return _schemaName; - } - - public void setSchemaName(String schemaName) - { - _schemaName = schemaName; - } - - public String getOgaQueryName() - { - return _ogaQueryName; - } - - public void setOgaQueryName(String ogaQueryName) - { - _ogaQueryName = ogaQueryName; - } - - public String getAllQueryName() - { - return _allQueryName; - } - - public void setAllQueryName(String allQueryName) - { - _allQueryName = allQueryName; - } - } - - @RequiresPermission(AdminPermission.class) - public static class GetEtlDetailsAction extends ReadOnlyApiAction - { - @Override - public ApiResponse execute(Object form, BindException errors) - { - Map resultProperties = new HashMap<>(); - resultProperties.put("enabled", OGASyncManager.get().isEnabled()); - resultProperties.put("lastRun", OGASyncManager.get().getLastRun()); - resultProperties.put("nextRun", OGASyncManager.get().getNextRun()); - - String[] etlConfigKeys = {OGASyncManager.LABKEY_USER_PROP_NAME, OGASyncManager.LABKEY_CONTAINER_PROP_NAME, OGASyncManager.DATA_SOURCE_PROP_NAME, OGASyncManager.SCHEMA_PROP_NAME, OGASyncManager.OGA_QUERY_PROP_NAME, OGASyncManager.ALL_QUERY_PROP_NAME, OGASyncManager.HOUR_PROP_NAME}; - - resultProperties.put("configKeys", etlConfigKeys); - resultProperties.put("config", PropertyManager.getProperties(OGASyncManager.CONFIG_PROPERTY_DOMAIN)); - - return new ApiSimpleResponse(resultProperties); - } - } -} \ No newline at end of file diff --git a/ogasync/src/org/labkey/ogasync/OGASyncManager.java b/ogasync/src/org/labkey/ogasync/OGASyncManager.java deleted file mode 100644 index 93ce4e8ca..000000000 --- a/ogasync/src/org/labkey/ogasync/OGASyncManager.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (c) 2013-2026 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. - */ - -package org.labkey.ogasync; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.labkey.api.data.Container; -import org.labkey.api.data.ContainerManager; -import org.labkey.api.data.DbSchema; -import org.labkey.api.data.DbSchemaType; -import org.labkey.api.data.DbScope; -import org.labkey.api.data.PropertyManager; -import org.labkey.api.data.PropertyManager.WritablePropertyMap; -import org.labkey.api.data.TableInfo; -import org.labkey.api.security.User; -import org.labkey.api.security.UserManager; -import org.labkey.api.security.ValidEmail; -import org.labkey.api.util.JobRunner; -import org.quartz.CronScheduleBuilder; -import org.quartz.JobBuilder; -import org.quartz.JobDetail; -import org.quartz.Trigger; -import org.quartz.TriggerBuilder; -import org.quartz.impl.StdSchedulerFactory; - -import java.util.Date; - -public class OGASyncManager -{ - private static final OGASyncManager _instance = new OGASyncManager(); - - private OGASyncManager() - { - - } - - public static OGASyncManager get() - { - return _instance; - } - - private static final Logger _log = LogManager.getLogger(OGASyncManager.class); - public static final String LABKEY_USER_PROP_NAME = "labkeyUser"; - public static final String LABKEY_CONTAINER_PROP_NAME = "labkeyContainer"; - public static final String ENABLED_PROP_NAME = "etlStatus"; - public static final String HOUR_PROP_NAME = "hourOfDay"; - public static final String DATA_SOURCE_PROP_NAME = "dataSourceName"; - public static final String LAST_RUN_PROP_NAME = "lastRun"; - public static final String SCHEMA_PROP_NAME = "schemaName"; - public static final String OGA_QUERY_PROP_NAME = "ogaQueryName"; - public static final String ALL_QUERY_PROP_NAME = "allQueryName"; - - public static final String CONFIG_PROPERTY_DOMAIN = "org.labkey.ogasync.etl.config"; - - private JobDetail _job = null; - private Trigger _trigger = null; - private Integer _hourOfDay = null; - - public synchronized void schedule() - { - if (!isEnabled()) - return; - - try - { - validateSettings(); - _hourOfDay = getHourOfDay(); - - if (_hourOfDay <= 0) - { - _log.error("OGA sync has an invalid frequency, will not schedule: {}", _hourOfDay); - return; - } - - if (_job == null) - { - _job = JobBuilder.newJob(OGASyncRunner.class) - .withIdentity(OGASyncRunner.class.getCanonicalName(), OGASyncRunner.class.getCanonicalName()) - .usingJobData("ogaSync", OGASyncRunner.class.getName()) - .build(); - } - - _trigger = TriggerBuilder.newTrigger() - .withIdentity(OGASyncRunner.class.getCanonicalName(), OGASyncRunner.class.getCanonicalName()) - .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(_hourOfDay, 0)) - .forJob(_job) - .build(); - - StdSchedulerFactory.getDefaultScheduler().scheduleJob(_job, _trigger); - - _log.info("OGA sync scheduled to run at {}:00 each day", getHourOfDay()); - } - catch (IllegalArgumentException e) - { - _log.error("OGA sync is enabled, but the saved setting are invalid. Sync will not start.", e); - } - catch (Exception e) - { - _log.error("Error scheduling OGA sync", e); - } - } - - public synchronized void unschedule() - { - if (_job != null) - { - try - { - StdSchedulerFactory.getDefaultScheduler().deleteJob(_job.getKey()); - _trigger = null; - _log.info("OGA sync unscheduled"); - } - catch (Exception e) - { - _log.error("Error unscheduling OGA sync", e); - } - } - } - - public void onSettingsChange() - { - if (!isEnabled()) - { - if (_job != null) - unschedule(); - } - else - { - try - { - validateSettings(); - - if (_job == null) - { - schedule(); - } - else - { - if (!_hourOfDay.equals(getHourOfDay())) - { - _log.info("Rescheduling OGA Sync due to change in settings"); - unschedule(); - schedule(); - } - - //this indicates it is already scheduled with the correct frequency - } - } - catch (Exception e) - { - //ignore - } - } - } - - public void init() - { - if (isEnabled() && _trigger == null) - { - _log.info("scheduling OGA sync"); - JobRunner.getDefault().execute(() -> schedule(), 10000); - } - } - - public Date getNextRun() - { - if (_trigger == null) - return null; - - return _trigger.getFireTimeAfter(new Date()); - } - - public int getHourOfDay() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(HOUR_PROP_NAME); - if (prop == null) - return -1; - - Integer value = Integer.parseInt(prop); - - return value; - } - - public Date getLastRun() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(LAST_RUN_PROP_NAME); - if (prop == null) - return null; - - long value = Long.parseLong(prop); - - return new Date(value); - } - - public String getDataSourceName() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(DATA_SOURCE_PROP_NAME); - if (prop == null) - return null; - - return prop; - } - - public String getSchemaName() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(SCHEMA_PROP_NAME); - if (prop == null) - return null; - - return prop; - } - - - public String getOgaQueryName() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(OGA_QUERY_PROP_NAME); - if (prop == null) - return null; - - return prop; - } - - public String getAllQueryName() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(ALL_QUERY_PROP_NAME); - if (prop == null) - return null; - - return prop; - } - - public boolean isEnabled() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(ENABLED_PROP_NAME); - if (prop == null) - return false; - - boolean value = Boolean.parseBoolean(prop); - - return value; - } - - public User getLabKeyUser() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(LABKEY_USER_PROP_NAME); - if (prop == null) - return null; - - try - { - ValidEmail email = new ValidEmail(prop); - return UserManager.getUser(email); - } - catch (ValidEmail.InvalidEmailException e) - { - _log.error("Invalid email saved for OGA Sync: {}", e.getMessage()); - } - - return null; - } - - public Container getLabKeyContainer() - { - String prop = PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(LABKEY_CONTAINER_PROP_NAME); - if (prop == null) - return null; - - return ContainerManager.getForPath(prop); - } - - public void validateSettings() throws IllegalArgumentException - { - if (getLabKeyUser() == null) - throw new IllegalArgumentException("Unknown or invalid LabKey User"); - - if (PropertyManager.getProperties(CONFIG_PROPERTY_DOMAIN).get(LABKEY_CONTAINER_PROP_NAME) == null) - throw new IllegalArgumentException("No LabKey container set"); - - int hour = getHourOfDay(); - if (hour > 23) - throw new IllegalArgumentException("Hour of day cannot be more than 23"); - - if (isEnabled()) - { - if (hour < 0) - throw new IllegalArgumentException("Hour of day must be between 0-23"); - - if (getDataSourceName() == null) - throw new IllegalArgumentException("Must provide a data source name"); - - DbScope scope = DbScope.getDbScope(getDataSourceName()); - if (scope == null) - throw new IllegalArgumentException("Unknown data source: " + getDataSourceName()); - - if (getSchemaName() == null) - throw new IllegalArgumentException("Must provide a schemaName"); - - if (getOgaQueryName() == null) - throw new IllegalArgumentException("Must provide a queryName for OGA aliases"); - - if (getAllQueryName() == null) - throw new IllegalArgumentException("Must provide a queryName for all aliases"); - - DbSchema schema = scope.getSchema(getSchemaName(), DbSchemaType.Bare); - if (schema == null) - throw new IllegalArgumentException("Unknown schema: " + getSchemaName()); - - TableInfo ti = schema.getTable(getOgaQueryName()); - if (ti == null) - throw new IllegalArgumentException("Unknown table: " + getOgaQueryName()); - - TableInfo ti2 = schema.getTable(getAllQueryName()); - if (ti2 == null) - throw new IllegalArgumentException("Unknown table: " + getOgaQueryName()); - } - } - - public void setLastRun(Date date) - { - WritablePropertyMap pm = PropertyManager.getWritableProperties(CONFIG_PROPERTY_DOMAIN, true); - pm.put(LAST_RUN_PROP_NAME, String.valueOf(date.getTime())); - pm.save(); - } -} \ No newline at end of file diff --git a/ogasync/src/org/labkey/ogasync/OGASyncModule.java b/ogasync/src/org/labkey/ogasync/OGASyncModule.java deleted file mode 100644 index e2879ac3f..000000000 --- a/ogasync/src/org/labkey/ogasync/OGASyncModule.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2013-2026 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. - */ - -package org.labkey.ogasync; - -import org.jetbrains.annotations.Nullable; -import org.labkey.api.data.ContainerManager; -import org.labkey.api.ldk.ExtendedSimpleModule; -import org.labkey.api.module.ModuleContext; -import org.labkey.api.query.DetailsURL; -import org.labkey.api.security.permissions.AdminPermission; -import org.labkey.api.settings.AdminConsole; - -public class OGASyncModule extends ExtendedSimpleModule -{ - @Override - public String getName() - { - return "OGASync"; - } - - @Override - public @Nullable Double getSchemaVersion() - { - return null; - } - - @Override - public boolean hasScripts() - { - return false; - } - - @Override - protected void init() - { - addController("ogasync", OGASyncController.class); - } - - @Override - public void doStartupAfterSpringConfig(ModuleContext moduleContext) - { - OGASyncManager.get().init(); - DetailsURL details = DetailsURL.fromString("/ogaSync-begin.view", ContainerManager.getSharedContainer()); - AdminConsole.addLink(AdminConsole.SettingsLinkType.Management, "oga sync admin", details.getActionURL(), AdminPermission.class); - } -} \ No newline at end of file diff --git a/ogasync/src/org/labkey/ogasync/OGASyncRunner.java b/ogasync/src/org/labkey/ogasync/OGASyncRunner.java deleted file mode 100644 index ce210d937..000000000 --- a/ogasync/src/org/labkey/ogasync/OGASyncRunner.java +++ /dev/null @@ -1,557 +0,0 @@ -/* - * Copyright (c) 2013-2026 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. - */ -package org.labkey.ogasync; - -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; -import org.jetbrains.annotations.Nullable; -import org.labkey.api.collections.CaseInsensitiveHashMap; -import org.labkey.api.data.CompareType; -import org.labkey.api.data.Container; -import org.labkey.api.data.DbSchema; -import org.labkey.api.data.DbSchemaType; -import org.labkey.api.data.DbScope; -import org.labkey.api.data.SQLFragment; -import org.labkey.api.data.Selector; -import org.labkey.api.data.SimpleFilter; -import org.labkey.api.data.SqlExecutor; -import org.labkey.api.data.SqlSelector; -import org.labkey.api.data.Table; -import org.labkey.api.data.TableInfo; -import org.labkey.api.data.TableSelector; -import org.labkey.api.exp.api.ExperimentService; -import org.labkey.api.query.FieldKey; -import org.labkey.api.query.QueryService; -import org.labkey.api.security.User; -import org.labkey.api.util.PageFlowUtil; -import org.quartz.Job; -import org.quartz.JobExecutionContext; - -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; - -/** - * User: bimber - * Date: 10/10/13 - * Time: 12:26 PM - */ -public class OGASyncRunner implements Job -{ - private static final Logger _log = LogManager.getLogger(OGASyncRunner.class); - private static final String INVESTIGATOR_EMPLOYYE_ID_NUMBER = "investigatorEmployeeNumber"; - private static final String FISCAL_AUTHORITY_EMPLOYEE_ID_NUMBER = "fiscalAuthorityNumber"; - private static final String ADFM_EMP_NUM = "ADFM_EMP_NUM"; - private static final String AWARD_STATUS = "awardStatus"; - private static final String PROJECT_STATUS = "projectStatus"; - - public OGASyncRunner() - { - - } - - @Override - public void execute(JobExecutionContext context) - { - if (!OGASyncManager.get().isEnabled()) - return; - - run(); - } - - public void run() - { - _log.info("Starting OGA Sync"); - OGASyncManager.get().validateSettings(); - - User u = OGASyncManager.get().getLabKeyUser(); - Container c = OGASyncManager.get().getLabKeyContainer(); - if (c == null) - { - _log.error("Invalid LabKey container"); - return; - } - - TableInfo sourceTable = getOGAAliasesTable(); - if (sourceTable == null) - { - _log.error("Unable to find OGA aliases table"); - return; - } - - DbSchema targetSchema = DbSchema.get("onprc_billing"); - if (targetSchema == null) - { - _log.error("Unable to find schema: onprc_billing"); - return; - } - - try - { - doMergeInvestigators(u, c, sourceTable, targetSchema); - doMergeGrants(u, c, sourceTable, targetSchema); - doMergeGrantProjects(u, c, sourceTable, targetSchema); - doMergeOGAAccounts(u, c, sourceTable, targetSchema); - - doMergeOtherAccounts(u, c, sourceTable, targetSchema); - - updateStats(targetSchema); - } - catch (SQLException e) - { - _log.error(e.getMessage(), e); - } - - OGASyncManager.get().setLastRun(new Date()); - _log.info("Finished OGA Sync"); - } - - private TableInfo getOGAAliasesTable() - { - DbScope scope = DbScope.getDbScope(OGASyncManager.get().getDataSourceName()); - if (scope == null) - return null; - - DbSchema schema = scope.getSchema(OGASyncManager.get().getSchemaName(), DbSchemaType.Bare); - if (schema == null) - return null; - - TableInfo ti = schema.getTable(OGASyncManager.get().getOgaQueryName()); - if (ti == null) - return null; - - return ti; - } - - private TableInfo getAllAliasesTable() - { - DbScope scope = DbScope.getDbScope(OGASyncManager.get().getDataSourceName()); - if (scope == null) - return null; - - DbSchema schema = scope.getSchema(OGASyncManager.get().getSchemaName(), DbSchemaType.Bare); - if (schema == null) - return null; - - TableInfo ti = schema.getTable(OGASyncManager.get().getAllQueryName()); - if (ti == null) - return null; - - return ti; - } - - public void doMergeGrantProjects(User u, Container c, TableInfo sourceTable, DbSchema targetSchema) throws SQLException - { - TableInfo targetTable = targetSchema.getTable("grantProjects"); - Map fieldMap = new LinkedHashMap<>(); - fieldMap.put("projectNumber", "OGA_PROJECT_NUMBER"); - fieldMap.put("grantNumber", "OGA_AWARD_NUMBER"); - fieldMap.put("agencyAwardNumber", "AGENCY_AWARD_NUMBER"); - fieldMap.put(INVESTIGATOR_EMPLOYYE_ID_NUMBER, "PI_EMP_NUM"); - fieldMap.put(FISCAL_AUTHORITY_EMPLOYEE_ID_NUMBER, "PDFM_EMP_NUM"); - fieldMap.put("investigatorName", "PI_FULL_NAME"); - - fieldMap.put("projectTitle", "PROJECT_TITLE"); - fieldMap.put("projectDescription", "PROJECT_DESCRIPTION"); - fieldMap.put("organization", "ORG"); - - fieldMap.put("budgetStartDate", "CURRENT_BUDGET_START_DATE"); - fieldMap.put("budgetEndDate", "CURRENT_BUDGET_END_DATE"); - - fieldMap.put("protocolNumber", "IACUC_NUMBER"); - fieldMap.put(PROJECT_STATUS, "PROJECT_STATUS"); - fieldMap.put("applicationType", "APPLICATION_TYPE"); - fieldMap.put("activityType", "ACTIVITY_TYPE"); - fieldMap.put("ogaProjectId", "PROJECT_ID"); - - TableSelector ts = new TableSelector(sourceTable, new LinkedHashSet<>(fieldMap.values())); - doMerge(u, c, targetTable, ts, "projectNumber", fieldMap, null, null, null, null); - } - - public void updateStats(DbSchema targetSchema) - { - TableInfo aliases = DbSchema.get("onprc_billing").getTable("aliases"); - SQLFragment analyze = targetSchema.getSqlDialect().getAnalyzeCommandForTable(aliases.getSelectName()); - new SqlExecutor(aliases.getSchema()).execute(analyze); - } - - public void doMergeOtherAccounts(User u, Container c, TableInfo sourceTable, DbSchema targetSchema) throws SQLException - { - TableInfo allAliases = getAllAliasesTable(); - - TableInfo targetTable = targetSchema.getTable("aliases"); - Map fieldMap = new LinkedHashMap<>(); - - fieldMap.put("alias", "ALIAS_NAME"); - fieldMap.put("aliasEnabled", "ENABLED_FLAG"); - - //fieldMap.put(FISCAL_AUTHORITY_EMPLOYEE_ID_NUMBER, "PDFM_EMP_NUM"); - fieldMap.put("category", null); - - fieldMap.put("budgetStartDate", "START_DATE_ACTIVE"); - fieldMap.put("budgetEndDate", "END_DATE_ACTIVE"); - - //find existing aliases - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("category"), "Other", CompareType.NEQ_OR_NULL); - filter.addCondition(FieldKey.fromString("container"), c.getId()); - TableSelector existingTs = new TableSelector(targetTable, PageFlowUtil.set("alias"), filter, null); - Collection existingKeys = existingTs.getCollection(String.class); - - //find existing FAs - SimpleFilter filter2 = new SimpleFilter(FieldKey.fromString("category"), "Other", CompareType.EQUAL); - filter2.addCondition(FieldKey.fromString("container"), c.getId()); - filter2.addCondition(new SimpleFilter.OrClause(new CompareType.CompareClause(FieldKey.fromString("fiscalAuthority"), CompareType.NONBLANK, null), new CompareType.CompareClause(FieldKey.fromString("investigatorid"), CompareType.NONBLANK, null))); - TableSelector existingTs2 = new TableSelector(targetTable, PageFlowUtil.set("alias", "fiscalAuthority", "investigatorid"), filter2, null); - final Map faMap = new HashMap<>(); - final Map investigatorMap = new HashMap<>(); - existingTs2.forEach(new Selector.ForEachBlock<>() - { - @Override - public void exec(ResultSet rs) throws SQLException - { - if (rs.getObject("fiscalAuthority") != null && rs.getInt("fiscalAuthority") != 0) - faMap.put(rs.getString("alias"), rs.getInt("fiscalAuthority")); - - if (rs.getObject("investigatorid") != null && rs.getInt("investigatorid") != 0) - investigatorMap.put(rs.getString("alias"), rs.getInt("investigatorid")); - } - }); - - TableSelector ts = new TableSelector(allAliases, new LinkedHashSet<>(fieldMap.values())); - doMerge(u, c, targetTable, ts, "alias", fieldMap, "Other", existingKeys, faMap, investigatorMap); - } - - public void doMergeOGAAccounts(User u, Container c, TableInfo sourceTable, DbSchema targetSchema) throws SQLException - { - TableInfo targetTable = targetSchema.getTable("aliases"); - Map fieldMap = new LinkedHashMap<>(); - - fieldMap.put("alias", "ALIAS"); - fieldMap.put("aliasEnabled", "ALIAS_ENABLED_FLAG"); - - fieldMap.put("projectNumber", "OGA_PROJECT_NUMBER"); - fieldMap.put("grantNumber", "OGA_AWARD_NUMBER"); - fieldMap.put("agencyAwardNumber", "AGENCY_AWARD_NUMBER"); - fieldMap.put(INVESTIGATOR_EMPLOYYE_ID_NUMBER, "PI_EMP_NUM"); - fieldMap.put(FISCAL_AUTHORITY_EMPLOYEE_ID_NUMBER, "PDFM_EMP_NUM"); - fieldMap.put(ADFM_EMP_NUM, "ADFM_EMP_NUM"); - fieldMap.put("fiscalAuthorityName", "PDFM_FULL_NAME"); - fieldMap.put("investigatorName", "PI_FULL_NAME"); - fieldMap.put("category", null); //special case handling below - fieldMap.put("aliasType", "OGA_AWARD_TYPE"); - - fieldMap.put("budgetStartDate", "CURRENT_BUDGET_START_DATE"); - fieldMap.put("budgetEndDate", "CURRENT_BUDGET_END_DATE"); - - fieldMap.put("faRate", "BURDEN_RATE"); - fieldMap.put("faSchedule", "BURDEN_SCHEDULE"); - - //new - fieldMap.put("projectTitle", "PROJECT_TITLE"); - fieldMap.put("projectDescription", "PROJECT_DESCRIPTION"); - fieldMap.put(PROJECT_STATUS, "PROJECT_STATUS"); - - - TableSelector ts = new TableSelector(sourceTable, new LinkedHashSet<>(fieldMap.values())); - doMerge(u, c, targetTable, ts, "alias", fieldMap, "OGA", null, null, null); - } - - public void doMergeGrants(User u, Container c, TableInfo sourceTable, DbSchema targetSchema) throws SQLException - { - TableInfo targetTable = targetSchema.getTable("grants"); - Map fieldMap = new LinkedHashMap<>(); - - fieldMap.put("grantNumber", "OGA_AWARD_NUMBER"); - //fieldMap.put("fundingAgency", ""); - //fieldMap.put("grantType", ""); - //fieldMap.put("", "AWARD_NUMBER"); - fieldMap.put("agencyAwardNumber", "AGENCY_AWARD_NUMBER"); - //fieldMap.put(INVESTIGATOR_EMPLOYYE_ID_NUMBER, "PI_EMP_NUM"); - fieldMap.put(FISCAL_AUTHORITY_EMPLOYEE_ID_NUMBER, ADFM_EMP_NUM); - //fieldMap.put("investigatorName", "PI_FULL_NAME"); - fieldMap.put("title", "PROJECT_TITLE"); - fieldMap.put(AWARD_STATUS, "AWARD_STATUS"); - fieldMap.put("projectDescription", "PROJECT_DESCRIPTION"); - fieldMap.put("applicationType", "APPLICATION_TYPE"); - fieldMap.put("activityType", "ACTIVITY_TYPE"); - fieldMap.put("budgetStartDate", "CURRENT_BUDGET_START_DATE"); - fieldMap.put("budgetEndDate", "CURRENT_BUDGET_END_DATE"); - fieldMap.put("awardSuffix", "AWARD_SUFFIX"); - fieldMap.put("organization", "ORG"); - fieldMap.put("protocolNum", "IACUC_NUMBER"); - fieldMap.put("ogaAwardId", "AWARD_ID"); - - StringBuilder sql = new StringBuilder(); - sql.append("SELECT\n"); - - String delim = ""; - for (String fieldName : fieldMap.values()) - { - sql.append(delim); - delim = ",\n"; - if (fieldName.equalsIgnoreCase("OGA_AWARD_NUMBER")) - { - sql.append(fieldName); - } - else - { - sql.append("max(").append(fieldName).append(") AS ").append(fieldName); - } - } - - sql.append("\nFROM " + sourceTable.getSelectName()).append("\n"); - sql.append("GROUP BY OGA_AWARD_NUMBER"); - - SqlSelector ss = new SqlSelector(sourceTable.getSchema(), new SQLFragment(sql.toString())); - doMerge(u, c, targetTable, ss, "grantNumber", fieldMap, null, null, null, null); - } - - public void doMergeInvestigators(User u, Container c, TableInfo sourceTable, DbSchema targetSchema) - { - - - } - - /** - * This is not particularly efficient, but it runs in the background once per day, - * and total rows should not be that large - */ - public void doMerge(final User u, final Container c, final TableInfo targetTable, Selector selector, final String selectionKey, final Map fieldMap, final String category, final Collection existingAliases, @Nullable final Map faMap, @Nullable final Map investigatorMap) throws SQLException - { - _log.info("starting to merge table: {}", targetTable.getName()); - - try (DbScope.Transaction transaction = ExperimentService.get().ensureTransaction()) - { - _log.info("truncating table"); - SqlExecutor ex = new SqlExecutor(targetTable.getSchema().getScope()); - ex.execute(new SQLFragment("DELETE FROM " + targetTable.getSelectName() + " WHERE container = ?" + (category != null ? " AND (category IS NULL OR category = '" + category + "')" : ""), c.getId())); - - final Map totals = new HashMap<>(); - totals.put("insert", 0); - totals.put("update", 0); - totals.put("total", 0); - final Date start = new Date(); - - selector.forEach(new Selector.ForEachBlock<>() - { - @Override - public void exec(ResultSet rs) throws SQLException - { - totals.put("total", totals.get("total") + 1); - if (totals.get("total") % 500 == 0) - { - _log.info("processed {} rows in {} seconds", totals.get("total"), ((new Date()).getTime() - start.getTime()) / 1000); - start.setTime(new Date().getTime()); - } - - Set columnNames = getColumnNames(rs); - - //first build the row - Map row = new CaseInsensitiveHashMap<>(); - row.put("container", c.getId()); - - for (String key : fieldMap.keySet()) - { - if (fieldMap.get(key) != null && !columnNames.contains(fieldMap.get(key))) - { - _log.error("Unknown column: {}", fieldMap.get(key)); - } - else - { - if (key.equals(INVESTIGATOR_EMPLOYYE_ID_NUMBER)) - { - row.put("investigatorId", resolveInvestigatorId(c, u, rs.getString(fieldMap.get(key)))); - } - else if (targetTable.getName().equalsIgnoreCase("aliases") && "category".equals(key)) - { - row.put("category", category); - } - else if (key.equals(ADFM_EMP_NUM)) - { - continue; - } - else if (key.equals("faRate")) - { - row.put(key, rs.getDouble(fieldMap.get(key))); - } - else if (key.equals(FISCAL_AUTHORITY_EMPLOYEE_ID_NUMBER)) - { - String id = rs.getString(fieldMap.get(key)); - if (id == null && fieldMap.containsKey(ADFM_EMP_NUM)) - { - id = rs.getString(ADFM_EMP_NUM); - } - - row.put("fiscalAuthority", resolveFinancialAnalystId(c, u, id)); - } - else if (key.equals(AWARD_STATUS) || key.equals(PROJECT_STATUS)) - { - String val = (String) rs.getObject(fieldMap.get(key)); - if ("1000".equals(val)) - { - val = "At Risk"; - } - else if ("1002".equals(val)) - { - val = "On Hold"; - } - else if ("1003".equals(val)) - { - val = "Preliminary"; - } - else if ("1004".equals(val)) - { - val = "Uncloseable"; - } - else if ("1005".equals(val)) - { - val = "Destroyed"; - } - else if ("1006".equals(val)) - { - val = "Partial Setup"; - } - else if ("1007".equals(val)) - { - val = "Preaward"; - } - else if ("1008".equals(val)) - { - val = "No Cost Ext"; - } - else if ("1009".equals(val)) - { - val = "Archived"; - } - else if ("1010".equals(val)) - { - val = "IM Purged"; - } - else if ("1011".equals(val)) - { - val = "Capitalized"; - } - else if ("1012".equals(val)) - { - val = "Technical Issues"; - } - - row.put(key, val); - } - else - { - row.put(key, rs.getObject(fieldMap.get(key))); - } - } - } - - assert targetTable.getPkColumns().size() == 1 : "Incorrect number of PK columns for table: " + targetTable.getName(); - - if (existingAliases != null && existingAliases.contains(rs.getString(fieldMap.get("alias")))) - { - //TODO: consider update - } - else - { - if (faMap != null && faMap.containsKey(row.get("alias"))) - { - row.put("fiscalAuthority", faMap.get(row.get("alias"))); - } - - if (investigatorMap != null && investigatorMap.containsKey(row.get("alias"))) - { - row.put("investigatorid", investigatorMap.get(row.get("alias"))); - } - - row.put("modifiedby", u.getUserId()); - row.put("modified", new Date()); - - row.put("createdby", u.getUserId()); - row.put("created", new Date()); - Table.insert(u, targetTable, row); - - totals.put("insert", totals.get("insert") + 1); - } - } - }); - - transaction.commit(); - _log.info("finished merging table: {}. total inserts: {}. total updates: {}", targetTable.getName(), totals.get("insert"), totals.get("update")); - } - } - - private Set getColumnNames(ResultSet rs) throws SQLException - { - Set columnNames = new HashSet<>(); - - ResultSetMetaData rsMetaData = rs.getMetaData(); - int numberOfColumns = rsMetaData.getColumnCount(); - - for (int i = 1; i < numberOfColumns + 1; i++) { - columnNames.add(rsMetaData.getColumnName(i)); - } - - return columnNames; - } - - private Map _investigatorMap = null; - - private Integer resolveInvestigatorId(Container c, User u, String employeeId) - { - if (_investigatorMap == null) - { - TableInfo ti = QueryService.get().getUserSchema(u, c, "onprc_ehr").getTable("investigators"); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("rowid", "employeeid")); - _investigatorMap = new HashMap<>(); - Collection> rows = ts.getMapCollection(); - for (Map row : rows) - { - if (row.containsKey("employeeid") && row.get("employeeid") != null) - _investigatorMap.put((String)row.get("employeeid"), (Integer)row.get("rowid")); - } - } - - return _investigatorMap.get(employeeId); - } - - private Map _financialAnalystMap = null; - - private Integer resolveFinancialAnalystId(Container c, User u, String employeeId) - { - if (_financialAnalystMap == null) - { - TableInfo ti = QueryService.get().getUserSchema(u, c, "onprc_billing").getTable("fiscalAuthorities"); - TableSelector ts = new TableSelector(ti, PageFlowUtil.set("rowid", "employeeid")); - _financialAnalystMap = new HashMap<>(); - Collection> rows = ts.getMapCollection(); - for (Map row : rows) - { - if (row.containsKey("employeeid") && row.get("employeeid") != null) - _financialAnalystMap.put((String)row.get("employeeid"), (Integer)row.get("rowid")); - } - } - - return _financialAnalystMap.get(employeeId); - } -} diff --git a/onprc_billing/resources/schemas/ArtCoreInvoicedItems.template.xml b/onprc_billing/resources/schemas/ArtCoreInvoicedItems.template.xml new file mode 100644 index 000000000..f8529ab4c --- /dev/null +++ b/onprc_billing/resources/schemas/ArtCoreInvoicedItems.template.xml @@ -0,0 +1,22 @@ + + + invoiceRuns + chargeableItemCategories + fiscalAuthorities + invoicedItems + + + + + + + + + + + + + \ No newline at end of file diff --git a/onprc_billing/src/org/labkey/onprc_billing/ONPRC_BillingModule.java b/onprc_billing/src/org/labkey/onprc_billing/ONPRC_BillingModule.java index 540e1e14a..1b6d8fa7d 100644 --- a/onprc_billing/src/org/labkey/onprc_billing/ONPRC_BillingModule.java +++ b/onprc_billing/src/org/labkey/onprc_billing/ONPRC_BillingModule.java @@ -49,7 +49,6 @@ import org.labkey.onprc_billing.dataentry.ChargesARTCoreFormType; import org.labkey.onprc_billing.dataentry.ReversalFormType; import org.labkey.onprc_billing.notification.BillingValidationNotification; -import org.labkey.onprc_billing.notification.DCMFinanceNotification; import org.labkey.onprc_billing.notification.FinanceNotification; import org.labkey.onprc_billing.pipeline.BillingPipelineProvider; import org.labkey.onprc_billing.query.BillingAuditProvider; @@ -113,7 +112,6 @@ protected void doStartupAfterSpringConfig(ModuleContext moduleContext) PipelineService.get().registerPipelineProvider(new BillingPipelineProvider(this)); NotificationService.get().registerNotification(new FinanceNotification()); - NotificationService.get().registerNotification(new DCMFinanceNotification()); NotificationService.get().registerNotification(new BillingValidationNotification()); EHRService.get().registerTableCustomizer(this, ONPRC_BillingCustomizer.class); diff --git a/onprc_billing/src/org/labkey/onprc_billing/notification/DCMFinanceNotification.java b/onprc_billing/src/org/labkey/onprc_billing/notification/DCMFinanceNotification.java deleted file mode 100644 index 1d4d161a6..000000000 --- a/onprc_billing/src/org/labkey/onprc_billing/notification/DCMFinanceNotification.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ -package org.labkey.onprc_billing.notification; - -import org.apache.commons.lang3.StringUtils; -import org.labkey.api.data.Container; -import org.labkey.onprc_billing.ONPRC_BillingManager; -import org.labkey.onprc_billing.ONPRC_BillingSchema; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; - -/** - - */ -public class DCMFinanceNotification extends FinanceNotification -{ - @Override - public String getName() - { - return "DCM Finance Notification"; - } - - @Override - public String getEmailSubject(Container c) - { - return "DCM Finance/Billing Alerts: " + getDateTimeFormat(c).format(new Date()); - } - - @Override - public String getCronString() - { - return "0 30 7 * * ?"; - } - - @Override - public String getScheduleDescription() - { - return "every day at 7:30AM"; - } - - @Override - protected void writeResultTable(final StringBuilder msg, Date lastInvoiceEnd, Calendar start, Calendar endDate, final Map>>> dataMap, final Map> totalsByCategory, Map categoryToQuery, Map containerMap, Container c) - { - msg.append("Charge Summary:

"); - msg.append("The table below summarizes projected charges since the since the last invoice date of " + getDateFormat(c).format(lastInvoiceEnd)); - - msg.append(""); - for (String category : totalsByCategory.keySet()) - { - Map totalsMap = totalsByCategory.get(category); - Container container = containerMap.get(category); - - String url = getExecuteQueryUrl(container, ONPRC_BillingSchema.NAME, categoryToQuery.get(category), null) + "&query.param.StartDate=" + getDateFormat(c).format(start.getTime()) + "&query.param.EndDate=" + getDateFormat(c).format(endDate.getTime()); - msg.append(""); - } - msg.append("
Category# ItemsAmount
" + category + "" + totalsMap.get("total") + "" + _dollarFormat.format(totalsMap.get("totalCost")) + "


"); - - msg.append("The tables below highlight any suspicious or abnormal items, grouped by project. These will not necessarily be problems, but may warrant investigation.

"); - - //NOTE: this is a slightly odd approach, but the primary notification groups these data by FA. we take this map and group it instead by project/alias - Map>> newDataMap = new TreeMap<>(); - Set foundCols = new LinkedHashSet<>(); - for (String financialAnalyst : dataMap.keySet()) - { - //first collect all distinct columns we will need to show - outerloop: - for (FieldDescriptor fd : _fields) - { - for (String key : dataMap.get(financialAnalyst).keySet()) - { - Map> projectDataByCategory = dataMap.get(financialAnalyst).get(key); - for (String category : projectDataByCategory.keySet()) - { - if (projectDataByCategory.get(category).containsKey(fd.getFieldName())) - { - foundCols.add(fd); - continue outerloop; - } - } - } - } - - //then transform the initial Map based on FA into one based on project/alias - for (String key : dataMap.get(financialAnalyst).keySet()) - { - List tokens = new ArrayList<>(Arrays.asList(key.split("<>"))); - tokens.removeFirst(); //remove FA - String newKey = StringUtils.join(tokens, "<>"); - Map> newDataByCategory = newDataMap.get(newKey); - if (newDataByCategory == null) - newDataByCategory = new TreeMap<>(); - - Map> dataByCategory = dataMap.get(financialAnalyst).get(key); - for (String category : dataByCategory.keySet()) - { - Map newTotals = newDataByCategory.get(category); - if (newTotals == null) - newTotals = new TreeMap<>(); - - Map totals = dataByCategory.get(category); - for (String t : totals.keySet()) - { - Integer newVal = newTotals.getOrDefault(t, 0); - newVal += totals.get(t); - newTotals.put(t, newVal); - } - - newDataByCategory.put(category, newTotals); - newDataMap.put(newKey, newDataByCategory); - } - } - } - - //reorder columns based on initial order - LinkedHashSet toShow = new LinkedHashSet<>(); - toShow.addAll(Arrays.asList(_fields)); - toShow.retainAll(foundCols); - - //now build the table itself - msg.append(""); - for (FieldDescriptor fd : toShow) - { - msg.append(""); - } - msg.append(""); - - //and append rows - for (String key : newDataMap.keySet()) - { - String[] tokens = key.split("<>"); - Map> dataByCategory = newDataMap.get(key); - for (String category : dataByCategory.keySet()) - { - Map totals = dataByCategory.get(category); - - String baseUrl = getExecuteQueryUrl(containerMap.get(category), ONPRC_BillingSchema.NAME, categoryToQuery.get(category), null) + "&query.param.StartDate=" + getDateFormat(c).format(start.getTime()) + "&query.param.EndDate=" + getDateFormat(c).format(endDate.getTime()); - String projUrl = baseUrl + ("None".equals(tokens[0]) ? "&query.project/displayName~isblank" : "&query.project/displayName~eq=" + tokens[0]); - msg.append(""); - - //alias - String accountUrl = null; - Container financeContainer = ONPRC_BillingManager.get().getBillingContainer(containerMap.get(category)); - if (financeContainer != null && !"Unknown".equals((tokens[1]))) - { - accountUrl = getExecuteQueryUrl(financeContainer, ONPRC_BillingSchema.NAME, "aliases", null, null) + "&query.alias~eq=" + tokens[1]; - } - - if (accountUrl != null) - { - msg.append(""); - } - else - { - msg.append(""); - } - - msg.append(""); - msg.append(""); - - for (FieldDescriptor fd : toShow) - { - if (totals.containsKey(fd.getFieldName())) - { - String url = projUrl + fd.getFilter(); - msg.append("" + totals.get(fd.getFieldName()) + ""); - } - else - { - msg.append(""); - } - } - - msg.append(""); - } - } - - msg.append("
ProjectAliasOGA ProjectCategory" + fd.getLabel() + "
" + tokens[0] + "" + tokens[1] + "" + (tokens[1]) + "" + (tokens[2]) + "" + category + "


"); - msg.append("


"); - } -} diff --git a/onprc_billing/src/org/labkey/onprc_billing/notification/FinanceNotification.java b/onprc_billing/src/org/labkey/onprc_billing/notification/FinanceNotification.java index 5fa82ec32..daa3d5a5b 100644 --- a/onprc_billing/src/org/labkey/onprc_billing/notification/FinanceNotification.java +++ b/onprc_billing/src/org/labkey/onprc_billing/notification/FinanceNotification.java @@ -39,6 +39,7 @@ import org.labkey.api.query.QueryService; import org.labkey.api.query.UserSchema; import org.labkey.api.security.User; +import org.labkey.api.util.PageFlowUtil; import org.labkey.onprc_billing.ONPRC_BillingManager; import org.labkey.onprc_billing.ONPRC_BillingModule; import org.labkey.onprc_billing.ONPRC_BillingSchema; @@ -422,8 +423,8 @@ protected void writeResultTable(final StringBuilder msg, Date lastInvoiceEnd, Ca Map totalsMap = totalsByCategory.get(category); Container container = containerMap.get(category); - String url = getExecuteQueryUrl(container, ONPRC_BillingSchema.NAME, categoryToQuery.get(category), null) + "&query.param.StartDate=" + getDateFormat(c).format(start.getTime()) + "&query.param.EndDate=" + getDateFormat(c).format(endDate.getTime()); - msg.append("" + category + "" + totalsMap.get("total") + "" + _dollarFormat.format(totalsMap.get("totalCost")) + ""); + String url = getExecuteQueryUrl(container, ONPRC_BillingSchema.NAME, categoryToQuery.get(category), null) + "&query.param.StartDate=" + PageFlowUtil.encodeURIComponent(getDateFormat(c).format(start.getTime())) + "&query.param.EndDate=" + PageFlowUtil.encodeURIComponent(getDateFormat(c).format(endDate.getTime())); + msg.append("" + PageFlowUtil.filter(category) + "" + totalsMap.get("total") + "" + _dollarFormat.format(totalsMap.get("totalCost")) + ""); } msg.append("

"); @@ -466,37 +467,37 @@ protected void writeResultTable(final StringBuilder msg, Date lastInvoiceEnd, Ca { Map totals = dataByCategory.get(category); - String baseUrl = getExecuteQueryUrl(containerMap.get(category), ONPRC_BillingSchema.NAME, categoryToQuery.get(category), null) + "&query.param.StartDate=" + getDateFormat(c).format(start.getTime()) + "&query.param.EndDate=" + getDateFormat(c).format(endDate.getTime()); - String projUrl = baseUrl + ("None".equals(tokens[1]) ? "&query.project/displayName~isblank" : "&query.project/displayName~eq=" + tokens[1]); - msg.append("" + financialAnalyst + ""); //the FA - msg.append("" + tokens[1] + ""); + String baseUrl = getExecuteQueryUrl(containerMap.get(category), ONPRC_BillingSchema.NAME, categoryToQuery.get(category), null) + "&query.param.StartDate=" + PageFlowUtil.encodeURIComponent(getDateFormat(c).format(start.getTime())) + "&query.param.EndDate=" + PageFlowUtil.encodeURIComponent(getDateFormat(c).format(endDate.getTime())); + String projUrl = baseUrl + ("None".equals(tokens[1]) ? "&query.project/displayName~isblank" : "&query.project/displayName~eq=" + PageFlowUtil.encodeURIComponent(tokens[1])); + msg.append("" + PageFlowUtil.filter(financialAnalyst) + ""); //the FA + msg.append("" + PageFlowUtil.filter(tokens[1]) + ""); //alias String accountUrl = null; Container financeContainer = ONPRC_BillingManager.get().getBillingContainer(containerMap.get(category)); if (financeContainer != null && !"Unknown".equals((tokens[2]))) { - accountUrl = getExecuteQueryUrl(financeContainer, ONPRC_BillingSchema.NAME, "aliases", null, null) + "&query.alias~eq=" + tokens[2]; + accountUrl = getExecuteQueryUrl(financeContainer, ONPRC_BillingSchema.NAME, "aliases", null, null) + "&query.alias~eq=" + PageFlowUtil.encodeURIComponent(tokens[2]); } if (accountUrl != null) { - msg.append("" + tokens[2] + ""); + msg.append("" + PageFlowUtil.filter(tokens[2]) + ""); } else { - msg.append("" + (tokens[2]) + ""); + msg.append("" + PageFlowUtil.filter(tokens[2]) + ""); } - msg.append("" + (tokens[3]) + ""); - msg.append("" + category + ""); + msg.append("" + PageFlowUtil.filter(tokens[3]) + ""); + msg.append("" + PageFlowUtil.filter(category) + ""); for (FieldDescriptor fd : foundCols) { if (totals.containsKey(fd.getFieldName())) { String url = projUrl + fd.getFilter(); - msg.append("" + totals.get(fd.getFieldName()) + ""); + msg.append("" + totals.get(fd.getFieldName()) + ""); } else { diff --git a/onprc_ehr/resources/queries/study/Birth/BirthSource.qview.xml b/onprc_ehr/resources/queries/study/Birth/BirthSource.qview.xml new file mode 100644 index 000000000..cdebfc248 --- /dev/null +++ b/onprc_ehr/resources/queries/study/Birth/BirthSource.qview.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/onprc_ehr/resources/queries/study/NHPCull.query.xml b/onprc_ehr/resources/queries/study/NHPCull.query.xml new file mode 100644 index 000000000..944591c17 --- /dev/null +++ b/onprc_ehr/resources/queries/study/NHPCull.query.xml @@ -0,0 +1,10 @@ + + + + + NHPs marked as Cull + NHPCull +
+
+
+
\ No newline at end of file diff --git a/onprc_ehr/resources/queries/study/NHPCull.sql b/onprc_ehr/resources/queries/study/NHPCull.sql new file mode 100644 index 000000000..de594a997 --- /dev/null +++ b/onprc_ehr/resources/queries/study/NHPCull.sql @@ -0,0 +1,13 @@ +SELECT f.Id, +f.date, +f.flag, +f.performedby, +f.remark, +f.taskid, +f.description, +f.RequestedBY, +f.TargetEndDate, +f.ScheduleNecropsy, +f.history +FROM flags f join demographics d on f.id = d.id +where f.flag.value like '%Cull%' and d.calculated_Status = 'alive' and f.enddate is null \ No newline at end of file diff --git a/onprc_ehr/resources/queries/study/NHPUUL.query.xml b/onprc_ehr/resources/queries/study/NHPUUL.query.xml new file mode 100644 index 000000000..b4fb37cd9 --- /dev/null +++ b/onprc_ehr/resources/queries/study/NHPUUL.query.xml @@ -0,0 +1,10 @@ + + + + + NHPs marked as Cull + NHPULL +
+
+
+
\ No newline at end of file diff --git a/onprc_ehr/resources/queries/study/NHPUUL.sql b/onprc_ehr/resources/queries/study/NHPUUL.sql new file mode 100644 index 000000000..88af13a9a --- /dev/null +++ b/onprc_ehr/resources/queries/study/NHPUUL.sql @@ -0,0 +1,13 @@ +SELECT f.Id, +f.date, +f.enddate, +f.flag, +f.performedby, +f.remark, +f.taskid, +f.description, +f.RequestedBY, +f.ScheduleNecropsy, +f.history +FROM flags f join demographics d on f.id = d.id +where f.flag.value like '%Underutilized%' and d.calculated_status = 'alive' and f.enddate is null \ No newline at end of file diff --git a/onprc_ehr/resources/queries/study/clinpathRuns/Requests.qview.xml b/onprc_ehr/resources/queries/study/clinpathRuns/Requests.qview.xml index 022367044..e8b0c0146 100644 --- a/onprc_ehr/resources/queries/study/clinpathRuns/Requests.qview.xml +++ b/onprc_ehr/resources/queries/study/clinpathRuns/Requests.qview.xml @@ -17,11 +17,6 @@ - - - - - diff --git a/onprc_ehr/resources/queries/study/treatmentSchedule.query.xml b/onprc_ehr/resources/queries/study/treatmentSchedule.query.xml index e5689ef32..751f34472 100644 --- a/onprc_ehr/resources/queries/study/treatmentSchedule.query.xml +++ b/onprc_ehr/resources/queries/study/treatmentSchedule.query.xml @@ -73,7 +73,7 @@ true - true + false core qcstate diff --git a/onprc_ehr/resources/queries/study/treatmentSchedule/.qview.xml b/onprc_ehr/resources/queries/study/treatmentSchedule/.qview.xml index 9ef8f2ccd..95509a802 100644 --- a/onprc_ehr/resources/queries/study/treatmentSchedule/.qview.xml +++ b/onprc_ehr/resources/queries/study/treatmentSchedule/.qview.xml @@ -17,7 +17,7 @@ - + diff --git a/onprc_ehr/resources/schemas/dbscripts/postgresql/onprc_ehr-26.002-26.003.sql b/onprc_ehr/resources/schemas/dbscripts/postgresql/onprc_ehr-26.002-26.003.sql index 3580eee74..091659828 100644 --- a/onprc_ehr/resources/schemas/dbscripts/postgresql/onprc_ehr-26.002-26.003.sql +++ b/onprc_ehr/resources/schemas/dbscripts/postgresql/onprc_ehr-26.002-26.003.sql @@ -1,3 +1,6 @@ +-- Current scripts create this as a FUNCTION, but earlier versions had created a PROCEDURE by this name. Tolerate that case. +DROP PROCEDURE IF EXISTS audit.ArchiveAuditTables; + CREATE OR REPLACE FUNCTION audit.ArchiveAuditTables( INOUT RetentionMonths INT ) diff --git a/onprc_ehr/resources/schemas/dbscripts/postgresql/onprc_ehr-26.003-26.004.sql b/onprc_ehr/resources/schemas/dbscripts/postgresql/onprc_ehr-26.003-26.004.sql new file mode 100644 index 000000000..00fad4b96 --- /dev/null +++ b/onprc_ehr/resources/schemas/dbscripts/postgresql/onprc_ehr-26.003-26.004.sql @@ -0,0 +1,71 @@ +/* + PostgreSQL equivalent of the sqlserver onprc_ehr-26.003-26.004.sql script. + + Two translation notes: + - SQL Server stored procedures are implemented as zero-argument plpgsql functions here, so each + EXEC core.fn_dropifexists '','','PROCEDURE' becomes DROP FUNCTION IF EXISTS .(). + - The objects the sqlserver script drops out of 'dbo', and the onprc_ehr_compliancedb procedure, have no + PostgreSQL counterpart -- nothing on this platform ever created them. They are left as comments below, + in the same order as the sqlserver script, so the two files still read side by side. + */ +---Dropping user defined sql queries +--- ComplianceProcedureRecenttTestsorg.sql +---- ComplianceProcedureRecentTestsorg --> directory and xml files + +--- ComplianceRecenttTestsorg.sql +---- ComplianceRecentTestsorg --> directory and xml files + + +----Drop corresponding temp tables +---- No temp tables to include here +--Drop stored procedures +DROP FUNCTION IF EXISTS onprc_ehr.sp_Compliance_requirementname_Update_Process(); + +----Drop corresponding temp tables + +--Drop stored procedures +DROP FUNCTION IF EXISTS onprc_ehr.s_JmacRemovalDateProcess(); + +DROP TABLE IF EXISTS onprc_ehr.Rpt_TempJmacDate; + +DROP TABLE IF EXISTS onprc_ehr.JmacRemovalDate; + +----Drop corresponding temp tables + ---- No temp tables to include here +--Drop stored procedures +DROP FUNCTION IF EXISTS onprc_ehr.p_EnvironmentalHistoricalUpdates(); + +----Drop corresponding temp tables + ---- No temp tables to include here +--Drop stored procedures +DROP FUNCTION IF EXISTS onprc_ehr.p_Environmental_Update_Process(); + +--Drop stored procedures +---- sqlserver only: dbo.sp_RpSLASummaryCensus was never created on PostgreSQL + +----Drop corresponding temp tables +---- sqlserver only: dbo.Rpt_SLaCensus was never created on PostgreSQL + + +--Drop stored procedures +---- sqlserver only: dbo.RptMergeChargetypeUpdateSP was never created on PostgreSQL + +----Drop corresponding temp tables +---- sqlserver only: dbo.Rpt_Labwork_MergeUpdate was never created on PostgreSQL +---- sqlserver only: dbo.Rpt_Labwork_MergeUpdatelog was never created on PostgreSQL + + +--Drop stored procedures +DROP FUNCTION IF EXISTS onprc_ehr.s_MasterProblemHistoricalProcess(); + + +----Drop corresponding temp tables +---- No temp tables to include here +--Drop stored procedures +---- sqlserver only: the onprc_ehr_compliancedb schema has no PostgreSQL dbscripts, so +---- p_ComplianceTranslatestringUpdate does not exist on this platform + +----Drop corresponding temp tables +DROP TABLE IF EXISTS onprc_ehr.Rpt_TempProblemList; + +DROP TABLE IF EXISTS onprc_ehr.Rpt_TempProblemListMaster; diff --git a/onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-26.003-26.004.sql b/onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-26.003-26.004.sql new file mode 100644 index 000000000..26838c022 --- /dev/null +++ b/onprc_ehr/resources/schemas/dbscripts/sqlserver/onprc_ehr-26.003-26.004.sql @@ -0,0 +1,82 @@ +/* + Created: 7-16-2026 R. Blasa Process to removed temp tables, and stored prcoedure that are no longer needed + + */ +---Dropping user defined sql queries +--- ComplianceProcedureRecenttTestsorg.sql +---- ComplianceProcedureRecentTestsorg --> directory and xml files + +--- ComplianceRecenttTestsorg.sql +---- ComplianceRecentTestsorg --> directory and xml files + + +----Drop corresponding temp tables +---- No temp tables to include here +--Drop stored procedures +EXEC core.fn_dropifexists 'sp_Compliance_requirementname_Update_Process','onprc_ehr','PROCEDURE'; +GO +----Drop corresponding temp tables + +--Drop stored procedures +EXEC core.fn_dropifexists 's_JmacRemovalDateProcess','onprc_ehr','PROCEDURE'; +GO + +EXEC core.fn_dropifexists 'Rpt_TempJmacDate','onprc_ehr','TABLE'; +GO + +EXEC core.fn_dropifexists 'JmacRemovalDate','onprc_ehr','TABLE'; +GO +----Drop corresponding temp tables + ---- No temp tables to include here +--Drop stored procedures +EXEC core.fn_dropifexists 'p_EnvironmentalHistoricalUpdates','onprc_ehr','PROCEDURE'; +GO +----Drop corresponding temp tables + ---- No temp tables to include here +--Drop stored procedures +EXEC core.fn_dropifexists 'p_Environmental_Update_Process','onprc_ehr','PROCEDURE'; +GO + +--Drop stored procedures +EXEC core.fn_dropifexists 'sp_RpSLASummaryCensus','dbo','PROCEDURE'; +GO + +----Drop corresponding temp tables +EXEC core.fn_dropifexists 'Rpt_SLaCensus','dbo','TABLE'; +GO + + +--Drop stored procedures +EXEC core.fn_dropifexists 'RptMergeChargetypeUpdateSP','dbo','PROCEDURE'; +GO + +----Drop corresponding temp tables +EXEC core.fn_dropifexists 'Rpt_Labwork_MergeUpdate','dbo','TABLE'; +GO +EXEC core.fn_dropifexists 'Rpt_Labwork_MergeUpdatelog','dbo','TABLE'; +GO + + +--Drop stored procedures +EXEC core.fn_dropifexists 's_MasterProblemHistoricalProcess','onprc_ehr','PROCEDURE'; +GO + + +----Drop corresponding temp tables +---- No temp tables to include here +--Drop stored procedures +EXEC core.fn_dropifexists 'p_ComplianceTranslatestringUpdate','onprc_ehr_compliancedb','PROCEDURE'; +GO + +----Drop corresponding temp tables +EXEC core.fn_dropifexists 'Rpt_TempProblemList','onprc_ehr','TABLE'; +GO + +EXEC core.fn_dropifexists 'Rpt_TempProblemListMaster','onprc_ehr','TABLE'; +GO + + + + + + diff --git a/onprc_ehr/resources/schemas/onprc_ehr.xml b/onprc_ehr/resources/schemas/onprc_ehr.xml index 2e4c069f5..26e225c6f 100644 --- a/onprc_ehr/resources/schemas/onprc_ehr.xml +++ b/onprc_ehr/resources/schemas/onprc_ehr.xml @@ -1517,46 +1517,4 @@ - - - - - - - -
- - - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - diff --git a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js index ff62d73b8..c5103d51b 100644 --- a/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js +++ b/onprc_ehr/resources/scripts/onprc_ehr/onprc_triggers.js @@ -1150,6 +1150,9 @@ exports.init = function(EHR){ if (!row.quantity && row.num_tubes && row.tube_vol){ row.quantity = row.num_tubes * row.tube_vol; } + if (row.additionalServices == null) { + EHR.Server.Utils.addError(scriptErrors, 'additionalServices', 'Please select from a list of Additional Services items', 'INFO'); + } if (row.additionalServices) { if (row.tube_type || row.tube_vol){ diff --git a/onprc_ehr/resources/web/onprc_ehr/panel/EnterDataPanel.js b/onprc_ehr/resources/web/onprc_ehr/panel/EnterDataPanel.js index a06c1c71f..d0420b20f 100644 --- a/onprc_ehr/resources/web/onprc_ehr/panel/EnterDataPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/panel/EnterDataPanel.js @@ -497,14 +497,9 @@ Ext4.define('onprc_ehr.panel.EnterDataPanel', { width: 200 },{ xtype: 'ldk-linkbutton', - text: 'Requests With Manual Results', + text: 'Requests', linkCls: 'labkey-text-link', - href: LABKEY.ActionURL.buildURL('query', 'executeQuery', null, {schemaName: 'study', 'query.queryName': 'Clinpath Runs', 'query.viewName': 'Requests', 'query.QCState/Label~startswith': 'Request:', 'query.servicerequested/chargetype~eq': 'Clinpath', 'query.mergeSyncInfo/automaticresults~eq': false}) - },{ - xtype: 'ldk-linkbutton', - text: 'Requests With Automatic Results', - linkCls: 'labkey-text-link', - href: LABKEY.ActionURL.buildURL('query', 'executeQuery', null, {schemaName: 'study', 'query.queryName': 'Clinpath Runs', 'query.viewName': 'Requests', 'query.QCState/Label~startswith': 'Request:', 'query.servicerequested/chargetype~eq': 'Clinpath', 'query.mergeSyncInfo/automaticresults~eq': true}) + href: LABKEY.ActionURL.buildURL('query', 'executeQuery', null, {schemaName: 'study', 'query.queryName': 'Clinpath Runs', 'query.viewName': 'Requests', 'query.QCState/Label~startswith': 'Request:', 'query.servicerequested/chargetype~eq': 'Clinpath'}) }] },{ layout: 'hbox', diff --git a/onprc_ehr/resources/web/onprc_ehr/panel/LabworkRequestInstructionsPanel.js b/onprc_ehr/resources/web/onprc_ehr/panel/LabworkRequestInstructionsPanel.js deleted file mode 100644 index 2b6422127..000000000 --- a/onprc_ehr/resources/web/onprc_ehr/panel/LabworkRequestInstructionsPanel.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2014-2026 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - */ -Ext4.define('ONPRC_EHR.panel.RequestInstructionsPanel', { - extend: 'Ext.panel.Panel', - alias: 'widget.onprc-labworkrequestinstructionspanel', - - initComponent: function(){ - var mergeURL = LABKEY.getModuleProperty('MergeSync', 'MergeURL'); - var items; - if (mergeURL){ - items = [{ - html: 'This form allows you to request Labwork, similar to requesting in Merge. After requesting Clinpath services through this form, this request will be created in Merge. You can print print labels through Merge.

' + - 'Click here to open Merge

' + - 'Click here for instructions on Merge label printing', - style: 'padding: 5px;' - }] - } - else { - items = [{ - html: 'The Merge URL has not been configured for this site', - style: 'padding: 5px;' - }] - } - - Ext4.apply(this, { - defaults: { - border: false - }, - items: items - }); - - this.callParent(arguments); - } -}); \ No newline at end of file diff --git a/onprc_ehr/resources/web/onprc_ehr/panel/ManageTreatmentsPanel.js b/onprc_ehr/resources/web/onprc_ehr/panel/ManageTreatmentsPanel.js index 0f2dcbf99..7305f0d54 100644 --- a/onprc_ehr/resources/web/onprc_ehr/panel/ManageTreatmentsPanel.js +++ b/onprc_ehr/resources/web/onprc_ehr/panel/ManageTreatmentsPanel.js @@ -193,7 +193,8 @@ Ext4.define('onprc_ehr.panel.ManageTreatmentsPanel', { columns: 'lsid,objectid,Id,date,enddate,project,category,remark,performedby,code,route,frequency,frequency/meaning,amountAndVolume,modifiedby/DisplayName,modified,enddateTimeCoalesced', filterArray: [ LABKEY.Filter.create('Id', this.animalId, LABKEY.Filter.Types.EQUAL), - LABKEY.Filter.create('enddateTimeCoalesced', xdate, LABKEY.Filter.Types.GTE)//Modified: 6-28-2018 R.Blasa + LABKEY.Filter.create('QCState/Label', 'Completed', LABKEY.Filter.Types.EQUAL), + LABKEY.Filter.create('enddateTimeCoalesced', xdate, LABKEY.Filter.Types.GTE) ], autoLoad: true, listeners: { diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java index eb1347e17..aeeeb29b8 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/ONPRC_EHRModule.java @@ -124,7 +124,7 @@ public String getName() @Override public @Nullable Double getSchemaVersion() { - return 26.003; + return 26.004; } @Override diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/LabworkRequestFormType.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/LabworkRequestFormType.java index 06c00dc03..0ac927ec9 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/LabworkRequestFormType.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/LabworkRequestFormType.java @@ -39,10 +39,6 @@ public LabworkRequestFormType(DataEntryFormContext ctx, Module owner) { super(ctx, owner, NAME, LABEL, "Requests", Arrays.asList( new RequestFormSection(), - - //Modified: 1-14-2019 R. Blasa No longer need Merge web link -// new LabworkRequestInstructionsFormSection(), - new AnimalDetailsFormSection(), new ClinpathRunsFormSection(true) )); @@ -55,7 +51,6 @@ public LabworkRequestFormType(DataEntryFormContext ctx, Module owner) //Added 2-8-2016 Blasa addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/model/sources/labworkPanel.js")); - addClientDependency(ClientDependency.supplierFromModuleName("MergeSync")); addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/panel/LabworkRequestDataEntryPanel.js")); setJavascriptClass("ONPRC_EHR.panel.LabworkRequestDataEntryPanel"); } diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/LabworkRequestInstructionsFormSection.java b/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/LabworkRequestInstructionsFormSection.java deleted file mode 100644 index 9ea7343a3..000000000 --- a/onprc_ehr/src/org/labkey/onprc_ehr/dataentry/LabworkRequestInstructionsFormSection.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2014-2026 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. - */ -package org.labkey.onprc_ehr.dataentry; - -import org.labkey.api.ehr.dataentry.AbstractFormSection; -import org.labkey.api.ehr.dataentry.DataEntryFormContext; -import org.labkey.api.ehr.dataentry.FormElement; -import org.labkey.api.view.template.ClientDependency; - -import java.util.Collections; -import java.util.List; - -/** - * User: bimber - * Date: 6/9/13 - * Time: 4:15 PM - */ -public class LabworkRequestInstructionsFormSection extends AbstractFormSection -{ - public LabworkRequestInstructionsFormSection() - { - super("LabworkRequestInstructions", "Instructions", "onprc-labworkrequestinstructionspanel"); - - addClientDependency(ClientDependency.supplierFromPath("onprc_ehr/panel/LabworkRequestInstructionsPanel.js")); - } - - @Override - protected List getFormElements(DataEntryFormContext ctx) - { - return Collections.emptyList(); - } -} diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/demographics/ActiveTreatmentsXDemographicsProvider.java b/onprc_ehr/src/org/labkey/onprc_ehr/demographics/ActiveTreatmentsXDemographicsProvider.java index 69ff1ef68..5b50c6941 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/demographics/ActiveTreatmentsXDemographicsProvider.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/demographics/ActiveTreatmentsXDemographicsProvider.java @@ -87,6 +87,8 @@ protected SimpleFilter getFilter(Collection ids) roundedMax = DateUtils.truncate(roundedMax, Calendar.DATE); SimpleFilter filter = super.getFilter(ids); + filter.addCondition(FieldKey.fromString("isActive"), true, CompareType.EQUAL); + filter.addCondition(FieldKey.fromString("qcstate/publicData"), true, CompareType.EQUAL); filter.addCondition(FieldKey.fromString("enddateTimeCoalesced"),roundedMax, CompareType.GTE); filter.addCondition(FieldKey.fromString("category"), "Husbandry", CompareType.NEQ_OR_NULL); diff --git a/onprc_ehr/src/org/labkey/onprc_ehr/notification/ColonyAlertsNotification.java b/onprc_ehr/src/org/labkey/onprc_ehr/notification/ColonyAlertsNotification.java index f7fa1b57d..240451c8b 100644 --- a/onprc_ehr/src/org/labkey/onprc_ehr/notification/ColonyAlertsNotification.java +++ b/onprc_ehr/src/org/labkey/onprc_ehr/notification/ColonyAlertsNotification.java @@ -225,7 +225,7 @@ protected void doCandidateChecks(final Container c, User u, final StringBuilder protected void candidatesForLongTime(final Container c, User u, final StringBuilder msg) { SimpleFilter filter = new SimpleFilter(FieldKey.fromString("isActive"), true, CompareType.EQUAL); - filter.addCondition(FieldKey.fromString("daysElapsed"), 30, CompareType.GTE); + filter.addCondition(FieldKey.fromString("daysElapsed"), 180, CompareType.GTE); filter.addCondition(FieldKey.fromString("flag/category"), "Assign Alias", CompareType.EQUAL); filter.addCondition(FieldKey.fromString("flag/value"), ONPRC_EHRManager.AUC_RESERVED, CompareType.NEQ_OR_NULL); @@ -233,7 +233,8 @@ protected void candidatesForLongTime(final Container c, User u, final StringBuil long count = ts.getRowCount(); if (count > 0) { - msg.append("WARNING: There are " + count + " flags for assignment aliases/candidates that have been active for more than 30 days. This may indicate these flags should be ended.
\n"); + //Changed the num of days by Kollil in Aug, 2026. Refer to tkt #15129 + msg.append("WARNING: There are " + count + " flags for assignment aliases/candidates that have been active for more than 180 days. This may indicate these flags should be ended.
\n"); msg.append("

Click here to view them
\n\n"); msg.append("


\n\n"); } diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_BillingTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_BillingTest.java index 484293385..55bdb0a44 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_BillingTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_BillingTest.java @@ -128,7 +128,6 @@ public void testNotifications() //run finance notifications Set notifications = new HashSet<>(); - notifications.add("DCM Finance Notification"); notifications.add("Finance Notification"); beginAt(WebTestHelper.getBaseURL() + "/ldk/" + getContainerPath() + "/notificationAdmin.view"); diff --git a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java index 5d91b7b35..89a380485 100644 --- a/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java +++ b/onprc_ehr/test/src/org/labkey/test/tests/onprc_ehr/ONPRC_EHRTest.java @@ -22,6 +22,7 @@ import org.json.JSONObject; import org.junit.Assert; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import org.labkey.remoteapi.CommandException; @@ -558,6 +559,8 @@ public void testArrivalApi() throws Exception } @Test + // Disabled because the flakiness is blocking ONPRC work; re-enable once it is resolved. + @Ignore("Flaky on TeamCity: 'Force Submit' is only disabled while validation is in flight, so the 'More Actions' menu check races a fast validation pass") public void testSubmitButtonsDisabledDuringValidation() throws Exception { List allIds = createTemporaryValidationAnimals(30); diff --git a/onprc_reports/resources/queries/sequenceanalysis/MHC_Data_Unified.sql b/onprc_reports/resources/queries/sequenceanalysis/MHC_Data_Unified.sql index 5e9794932..4b350de19 100644 --- a/onprc_reports/resources/queries/sequenceanalysis/MHC_Data_Unified.sql +++ b/onprc_reports/resources/queries/sequenceanalysis/MHC_Data_Unified.sql @@ -10,7 +10,8 @@ SELECT null as shortName, sum(t.totalTests) as totalTests, t.result, - GROUP_CONCAT(distinct t.assaytype) as type + GROUP_CONCAT(distinct t.assaytype) as type, + GROUP_CONCAT(distinct t.libraryType) as libraryTypes FROM geneticscore.mhc_data t GROUP BY t.subjectid, t.marker, t.result diff --git a/onprc_ssu/module.properties b/onprc_ssu/module.properties index b21928fe5..fbfea49ba 100644 --- a/onprc_ssu/module.properties +++ b/onprc_ssu/module.properties @@ -1,3 +1,3 @@ ModuleClass: org.labkey.onprc_ssu.ONPRC_SSUModule -SupportedDatabases: mssql -ManageVersion: false +SupportedDatabases: mssql, pgsql +ManageVersion: true diff --git a/onprc_ssu/resources/queries/onprc_ssu/schedule.js b/onprc_ssu/resources/queries/onprc_ssu/schedule.js index 8ad1d68aa..3aa4e6c60 100644 --- a/onprc_ssu/resources/queries/onprc_ssu/schedule.js +++ b/onprc_ssu/resources/queries/onprc_ssu/schedule.js @@ -6,6 +6,7 @@ var console = require("console"); var LABKEY = require("labkey"); +var ldkUtils = require("ldk/Utils").LDK.Server.Utils; var helper = org.labkey.ldk.query.LookupValidationHelper.create(LABKEY.Security.currentContainer.id, LABKEY.Security.currentUser.id, 'onprc_ssu', 'schedule'); @@ -27,17 +28,5 @@ function beforeUpdate(row, oldRow, errors){ } function beforeUpsert(row, errors){ - var lookupFields = ['projectName']; - for (var i=0;i= 21 days and enter --- the data into SLA tables --- ========================================================================================== - CREATE OR REPLACE FUNCTION onprc_ehr.SLAWeaningDataTransfer() RETURNS void LANGUAGE plpgsql @@ -545,16 +275,16 @@ DECLARE _DOT2 TIMESTAMP; _max_rowid INTEGER; BEGIN - --Check if any rodents age is 21 days and above and not transferred into SLA tables + -- Check if any rodents age is 21 days and above and not transferred into SLA tables SELECT COUNT(*) INTO _WCount FROM sla.weaning WHERE numAlive > 0 AND dateofTransfer IS NULL AND (CURRENT_DATE - CAST(date AS DATE)) >= 21; - --Found entries, so, insert those records into SLA.purchase and SLA.purchasedetails tables + -- Found entries, so, insert those records into SLA.purchase and SLA.purchasedetails tables IF _WCount > 0 THEN - --Create a local temp table to process the weaning data. + -- Create a local temp table to process the weaning data. CREATE TEMP TABLE TempWeaning ( rowid SERIAL NOT NULL, orig_weaning_rowid INTEGER, @@ -572,7 +302,7 @@ BEGIN created TIMESTAMP ) ON COMMIT DROP; - --Move the weaning entries into a temp table + -- Move the weaning entries into a temp table INSERT INTO TempWeaning (orig_weaning_rowid, investigator, date, project, vendorlocation, DOB, DOM, species, sex, strain, numAlive, created) SELECT rowid, investigator, date, project, vendorlocation, date, DOM, species, CASE @@ -586,18 +316,13 @@ BEGIN AND dateofTransfer IS NULL AND (CURRENT_DATE - CAST(date AS DATE)) >= 21; - --Set the counter seed value and upper bound + -- Set the counter seed value and upper bound SELECT MIN(rowid), MAX(rowid) INTO _counter, _max_rowid FROM TempWeaning; +-- TODO: Hard-coded, all-caps ENTITYIDs below! These should probably be lowercased. + WHILE _counter <= _max_rowid LOOP - /* Requestorid - (Kati Marshall ) - 7B3F1ED1-4CD9-4D9A-AFF4-FE0618D49C4B - Userid - (Kati Marshall) - 1294 - vendor - (ONPRC Weaning - SLA) - E1EE1B64-B7BE-1035-BFC4-5107380AE41E - container - (SLA) - 4831D09C-4169-1034-BAD2-5107380A9819 - created - (onprc-is) - 1003 - */ - SELECT dateofTransfer INTO _DOT FROM TempWeaning WHERE rowid = _counter; IF _DOT IS NULL THEN -- Get projectid, PI and account @@ -607,7 +332,6 @@ BEGIN _purchaseId := gen_random_uuid()::ENTITYID; - -- Check if the row is already transferred into the main SLA tables. If DOT is null means the row hasn't been transferred yet. -- Insert weaning data into sla.purchase table as a pending order INSERT INTO sla.purchase (project, account, requestorid, vendorid, hazardslist, dobrequired, comments, confirmationnum, housingconfirmed, @@ -616,7 +340,7 @@ BEGIN (_center_project, _alias, '7B3F1ED1-4CD9-4D9A-AFF4-FE0618D49C4B', 'E1EE1B64-B7BE-1035-BFC4-5107380AE41E', '', 0, '', NULL, NULL, NULL, NULL, NULL, '', _purchaseId, '4831D09C-4169-1034-BAD2-5107380A9819', 1003, now(), NULL, NULL, '', ''); - --Insert data into purchasedetails with the newly created purchaseid above + -- Insert data into purchasedetails with the newly created purchaseid above INSERT INTO sla.purchaseDetails (purchaseid, species, age, weight, weight_units, gestation, gender, strain, room, animalsordered, animalsreceived, boxesquantity, costperanimal, shippingcost, totalcost, housingInstructions, requestedarrivaldate, expectedarrivaldate, receiveddate, receivedby, cancelledby, datecancelled, @@ -626,7 +350,7 @@ BEGIN gen_random_uuid()::ENTITYID, '4831D09C-4169-1034-BAD2-5107380A9819', 1003, now(), NULL, NULL, date, vendorLocation FROM TempWeaning WHERE rowid = _counter; - --Update the sla.weaning row with the date of transfer date set for the transferred weaning row + -- Update the sla.weaning row with the date of transfer date set for the transferred weaning row UPDATE sla.weaning SET dateofTransfer = now() WHERE rowid = (SELECT orig_weaning_rowid FROM TempWeaning WHERE rowid = _counter); @@ -635,19 +359,18 @@ BEGIN SET dateofTransfer = now() WHERE rowid = _counter; - --Find if there are any rows with the same center project. Then create them under the same purchaseId - --set the new counter + -- Find if there are any rows with the same center project. Then create them under the same purchaseId _counter2 := _counter + 1; WHILE _counter2 <= _max_rowid LOOP SELECT dateofTransfer INTO _DOT2 FROM TempWeaning WHERE rowid = _counter2; IF _DOT2 IS NULL THEN - --Get projectid of the next row + -- Get projectid of the next row SELECT project INTO _center_project2 FROM ehr.project WHERE name = (SELECT project FROM TempWeaning WHERE rowid = _counter2); - --If they are same projects, then use the the same purchaseid when creating the purchase details record + -- If they are same projects, then use the same purchaseid when creating the purchase details record IF (_center_project = _center_project2) THEN INSERT INTO sla.purchaseDetails (purchaseid, species, age, weight, weight_units, gestation, gender, strain, room, animalsordered, animalsreceived, boxesquantity, costperanimal, shippingcost,