From 45cc6bbd65a44fa89a22e2ad826a583610d91672 Mon Sep 17 00:00:00 2001 From: cbrianbet Date: Wed, 12 Jun 2024 23:14:33 +0300 Subject: [PATCH 1/3] added county apis to his deployment --- src/common/common.controller.ts | 58 +++++++++++++++++++ src/common/common.module.ts | 4 ++ ...cility-by-infrastructure-county.handler.ts | 39 +++++++++++++ .../get-facility-status-by-county.handler.ts | 38 ++++++++++++ ...facility-by-infrastructure-county.query.ts | 7 +++ .../get-facility-status-by-county.query.ts | 7 +++ ...et-uptake-by-age-sex-positivity.handler.ts | 57 +++++++----------- .../handlers/get-uptake-by-age-sex.handler.ts | 55 ++++++++---------- 8 files changed, 199 insertions(+), 66 deletions(-) create mode 100644 src/common/queries/handlers/get-facility-by-infrastructure-county.handler.ts create mode 100644 src/common/queries/handlers/get-facility-status-by-county.handler.ts create mode 100644 src/common/queries/impl/get-facility-by-infrastructure-county.query.ts create mode 100644 src/common/queries/impl/get-facility-status-by-county.query.ts diff --git a/src/common/common.controller.ts b/src/common/common.controller.ts index 562fadcd..46ebf606 100644 --- a/src/common/common.controller.ts +++ b/src/common/common.controller.ts @@ -14,6 +14,8 @@ import { GetFacilityLevelByOwnershipCountyQuery } from './queries/impl/get-facil import { GetFacilityByInfrastructureQuery } from './queries/impl/get-facility-by-infrastructure.query'; import { GetFacilityLinelistQuery } from './queries/impl/get-facility-linelist.query'; import { GetFacilityTxcurrQuery } from './queries/impl/get-facility-txcurr.query'; +import { GetFacilityStatusByCountyQuery } from './queries/impl/get-facility-status-by-county.query'; +import { GetFacilityByInfrastructureCountyQuery } from './queries/impl/get-facility-by-infrastructure-county.query'; @Controller('common') export class CommonController { @@ -396,6 +398,62 @@ export class CommonController { return this.queryBus.execute(query); } + + @Get('facilityByInfrastructureCounty') + async getFacilityByInfrastructureCounty( + @Query('county') county, + @Query('subCounty') subCounty, + @Query('facility') facility, + @Query('partner') partner, + @Query('agency') agency, + ): Promise { + const query = new GetFacilityByInfrastructureCountyQuery(); + if(county) { + query.county = county; + } + if(subCounty) { + query.subCounty = subCounty; + } + if(facility) { + query.facility = facility; + } + if(partner) { + query.partner = partner; + } + if(agency) { + query.agency = agency; + } + return this.queryBus.execute(query); + } + + + @Get('facilityStatusByCounty') + async getFacilityStatusByCounty( + @Query('county') county, + @Query('subCounty') subCounty, + @Query('facility') facility, + @Query('partner') partner, + @Query('agency') agency, + ): Promise { + const query = new GetFacilityStatusByCountyQuery(); + if(county) { + query.county = county; + } + if(subCounty) { + query.subCounty = subCounty; + } + if(facility) { + query.facility = facility; + } + if(partner) { + query.partner = partner; + } + if(agency) { + query.agency = agency; + } + return this.queryBus.execute(query); + } + @Get('sites') async getSites(): Promise { return this.queryBus.execute(new GetSitesQuery()); diff --git a/src/common/common.module.ts b/src/common/common.module.ts index 0b157c37..f1cff631 100644 --- a/src/common/common.module.ts +++ b/src/common/common.module.ts @@ -15,6 +15,8 @@ import { GetFacilityLevelByOwnershipCountyHandler } from './queries/handlers/get import { GetFacilityByInfrastructureHandler } from './queries/handlers/get-facility-by-infrastructure.handler'; import { GetFacilityLinelistHandler } from './queries/handlers/get-facility-linelist.handler'; import { GetFacilityTxcurrHandler } from './queries/handlers/get-facility-txcurr.handler'; +import { GetFacilityStatusByCountyHandler } from './queries/handlers/get-facility-status-by-county.handler'; +import { GetFacilityByInfrastructureCountyHandler } from './queries/handlers/get-facility-by-infrastructure-county.handler'; import { CommonController } from './common.controller'; import { AllEmrSites } from '../care-treatment/common/entities/all-emr-sites.model'; import { LinelistFACTART } from '../care-treatment/common/entities/linelist-fact-art.model'; @@ -39,6 +41,8 @@ import { LinelistFACTART } from '../care-treatment/common/entities/linelist-fact GetFacilityByInfrastructureHandler, GetFacilityLinelistHandler, GetFacilityTxcurrHandler, + GetFacilityStatusByCountyHandler, + GetFacilityByInfrastructureCountyHandler ], controllers: [CommonController], }) diff --git a/src/common/queries/handlers/get-facility-by-infrastructure-county.handler.ts b/src/common/queries/handlers/get-facility-by-infrastructure-county.handler.ts new file mode 100644 index 00000000..d8f7fe38 --- /dev/null +++ b/src/common/queries/handlers/get-facility-by-infrastructure-county.handler.ts @@ -0,0 +1,39 @@ +import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { AllEmrSites } from '../../../care-treatment/common/entities/all-emr-sites.model'; +import { GetFacilityByInfrastructureCountyQuery } from '../impl/get-facility-by-infrastructure-county.query'; + +@QueryHandler(GetFacilityByInfrastructureCountyQuery) +export class GetFacilityByInfrastructureCountyHandler implements IQueryHandler { + constructor( + @InjectRepository(AllEmrSites, 'mssql') + private readonly repository: Repository, + ) {} + + async execute(query: GetFacilityByInfrastructureCountyQuery): Promise { + const facilitiesInfrastructure = this.repository + .createQueryBuilder('q') + .select('COUNT(1) facilities, InfrastructureType, County') + .where(`InfrastructureType is not null AND EMR_Status = 'Active'`); + + if (query.county) { + facilitiesInfrastructure.andWhere('q.County IN (:...county)', { + county: [query.county], + }); + } + + if (query.subCounty) { + facilitiesInfrastructure.andWhere('q.SubCounty IN (:...subCounty)', { + subCounty: [query.subCounty], + }); + } + + + return await facilitiesInfrastructure + .groupBy('q.InfrastructureType, County') + .orderBy('County') + .distinct(true) + .getRawMany(); + } +} diff --git a/src/common/queries/handlers/get-facility-status-by-county.handler.ts b/src/common/queries/handlers/get-facility-status-by-county.handler.ts new file mode 100644 index 00000000..90379567 --- /dev/null +++ b/src/common/queries/handlers/get-facility-status-by-county.handler.ts @@ -0,0 +1,38 @@ +import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { AllEmrSites } from '../../../care-treatment/common/entities/all-emr-sites.model'; +import { GetFacilityStatusByCountyQuery } from '../impl/get-facility-status-by-county.query'; + +@QueryHandler(GetFacilityStatusByCountyQuery) +export class GetFacilityStatusByCountyHandler implements IQueryHandler { + constructor( + @InjectRepository(AllEmrSites, 'mssql') + private readonly repository: Repository, + ) {} + + async execute(query: GetFacilityStatusByCountyQuery): Promise { + const facilitiesStatus = this.repository + .createQueryBuilder('q') + .select('COUNT(1) facilities, EMR_Status, County') + .where('EMR_Status is not null'); + + if (query.county) { + facilitiesStatus.andWhere('q.County IN (:...county)', { + county: [query.county], + }); + } + + if (query.subCounty) { + facilitiesStatus.andWhere('q.SubCounty IN (:...subCounty)', { + subCounty: [query.subCounty], + }); + } + + return await facilitiesStatus + .groupBy('q.EMR_Status, County') + .orderBy('County') + .distinct(true) + .getRawMany(); + } +} diff --git a/src/common/queries/impl/get-facility-by-infrastructure-county.query.ts b/src/common/queries/impl/get-facility-by-infrastructure-county.query.ts new file mode 100644 index 00000000..9d8174ee --- /dev/null +++ b/src/common/queries/impl/get-facility-by-infrastructure-county.query.ts @@ -0,0 +1,7 @@ +export class GetFacilityByInfrastructureCountyQuery { + county?: string[]; + subCounty?: string[]; + facility?: string[]; + partner?: string[]; + agency?: string[]; +} \ No newline at end of file diff --git a/src/common/queries/impl/get-facility-status-by-county.query.ts b/src/common/queries/impl/get-facility-status-by-county.query.ts new file mode 100644 index 00000000..74285ac4 --- /dev/null +++ b/src/common/queries/impl/get-facility-status-by-county.query.ts @@ -0,0 +1,7 @@ +export class GetFacilityStatusByCountyQuery { + county?: string[]; + subCounty?: string[]; + facility?: string[]; + partner?: string[]; + agency?: string[]; +} \ No newline at end of file diff --git a/src/hts/uptake/queries/handlers/get-uptake-by-age-sex-positivity.handler.ts b/src/hts/uptake/queries/handlers/get-uptake-by-age-sex-positivity.handler.ts index 2fc46fd1..9f8336b8 100644 --- a/src/hts/uptake/queries/handlers/get-uptake-by-age-sex-positivity.handler.ts +++ b/src/hts/uptake/queries/handlers/get-uptake-by-age-sex-positivity.handler.ts @@ -13,60 +13,47 @@ export class GetUptakeByAgeSexPositivityHandler ) {} async execute(query: GetUptakeByAgeSexPositivityQuery): Promise { - const params = []; - let uptakeByAgeSexSql = `SELECT - DATIMAgeGroup AgeGroup, - ((CAST(SUM(CASE WHEN positive IS NULL THEN 0 ELSE positive END) AS FLOAT)/CAST(SUM(Tested) AS FLOAT))*100) AS positivity - FROM - NDWH.dbo.FactHTSClientTests AS link - LEFT JOIN NDWH.dbo.DimPatient AS pat ON link.PatientKey = pat.PatientKey - LEFT JOIN NDWH.dbo.DimAgeGroup AS age ON link.AgeGroupKey = age.AgeGroupKey - LEFT JOIN NDWH.dbo.DimPartner AS part ON link.PartnerKey = part.PartnerKey - LEFT JOIN NDWH.dbo.DimFacility AS fac ON link.FacilityKey = fac.FacilityKey - LEFT JOIN NDWH.dbo.DimAgency AS agency ON link.AgencyKey = agency.AgencyKey - WHERE Tested > 0 and TestType IN ('Initial', 'Initial Test')`; + + let uptakeByAgeSex = this.repository + .createQueryBuilder(`q`) + .select(`AgeGroup, ((CAST(SUM(CASE WHEN positive IS NULL THEN 0 ELSE positive END) AS FLOAT)/CAST(SUM(Tested) AS FLOAT))*100) AS positivity`) + .where(`Tested > 0`); if (query.county) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and County IN ('${query.county - .toString() - .replace(/,/g, "','")}')` + uptakeByAgeSex.andWhere('County IN (:...counties)', { counties: query.county }); } if (query.subCounty) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and SubCounty IN ('${query.subCounty - .toString() - .replace(/,/g, "','")}')` + uptakeByAgeSex.andWhere('SubCounty IN (:...subCounties)', { subCounties: query.subCounty }); } if (query.facility) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and FacilityName IN ('${query.facility - .toString() - .replace(/,/g, "','")}')` + uptakeByAgeSex.andWhere('FacilityName IN (:...facilities)', { facilities: query.facility }); } - if (query.partner) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and PartnerName IN ('${query.partner - .toString() - .replace(/,/g, "','")}')` - } - if (query.month) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and month(DateTestedKey) = ${query.month}`; + if (query.partner) { + uptakeByAgeSex.andWhere('PartnerName IN (:...partners)', { partners: query.partner }); } - if (query.year) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and year(DateTestedKey) = ${query.year}`; - } if (query.fromDate) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and DateTestedKey >= ${query.fromDate}01`; + let year = `${query.fromDate}`.substring(0, 4); + let month = `${query.fromDate}`.substring(4, 6); + let formattedDate = `${year}-${month}-01`; + uptakeByAgeSex.andWhere('AsOfDate >= :fromDate', { fromDate: formattedDate }); } if (query.toDate) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and DateTestedKey <= EOMONTH('${query.toDate}01')`; + let toDate = `${query.toDate}`; + let year = toDate.substring(0, 4); + let month = toDate.substring(4, 6); + let formattedDate = `${year}-${month}-01`; + uptakeByAgeSex.andWhere('AsOfDate <= EOMONTH(:toDate)', { toDate: formattedDate }); } - uptakeByAgeSexSql = `${uptakeByAgeSexSql} GROUP BY DATIMAgeGroup`; - return await this.repository.query(uptakeByAgeSexSql, params); + return await uptakeByAgeSex + .groupBy(`AgeGroup`) + .getRawMany(); } } diff --git a/src/hts/uptake/queries/handlers/get-uptake-by-age-sex.handler.ts b/src/hts/uptake/queries/handlers/get-uptake-by-age-sex.handler.ts index 2a8206cf..462135c2 100644 --- a/src/hts/uptake/queries/handlers/get-uptake-by-age-sex.handler.ts +++ b/src/hts/uptake/queries/handlers/get-uptake-by-age-sex.handler.ts @@ -3,65 +3,58 @@ import { GetUptakeByAgeSexQuery } from '../impl/get-uptake-by-age-sex.query'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { FactHTSClientTests } from './../../../linkage/entities/fact-hts-client-tests.model'; +import { AggregateHTSUptake } from '../../entities/aggregate-hts-uptake.model'; @QueryHandler(GetUptakeByAgeSexQuery) export class GetUptakeByAgeSexHandler implements IQueryHandler { constructor( - @InjectRepository(FactHTSClientTests, 'mssql') - private readonly repository: Repository, + @InjectRepository(AggregateHTSUptake, 'mssql') + private readonly repository: Repository, ) {} async execute(query: GetUptakeByAgeSexQuery): Promise { const params = []; - let uptakeByAgeSexSql = `SELECT - DATIMAgeGroup AgeGroup, - CASE WHEN Gender = 'M' THEN 'Male' WHEN Gender = 'F' THEN 'Female' ELSE Gender END Gender, - SUM(Tested) Tested - FROM - NDWH.dbo.FactHTSClientTests AS link - LEFT JOIN NDWH.dbo.DimPatient AS pat ON link.PatientKey = pat.PatientKey - LEFT JOIN NDWH.dbo.DimAgeGroup AS age ON link.AgeGroupKey = age.AgeGroupKey - LEFT JOIN NDWH.dbo.DimPartner AS part ON link.PartnerKey = part.PartnerKey - LEFT JOIN NDWH.dbo.DimFacility AS fac ON link.FacilityKey = fac.FacilityKey - LEFT JOIN NDWH.dbo.DimAgency AS agency ON link.AgencyKey = agency.AgencyKey - WHERE Tested is not null and TestType IN ('Initial', 'Initial Test')`; + let uptakeByAgeSex = this.repository + .createQueryBuilder(`q`) + .select(`AgeGroup, Gender, SUM(Tested) Tested`) + .where(`Tested is not null`); if (query.county) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and County IN ('${query.county - .toString() - .replace(/,/g, "','")}')` + uptakeByAgeSex.andWhere('County IN (:...counties)', { counties: query.county }); } if (query.subCounty) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and SubCounty IN ('${query.subCounty - .toString() - .replace(/,/g, "','")}')` + uptakeByAgeSex.andWhere('SubCounty IN (:...subCounties)', { subCounties: query.subCounty }); } if (query.facility) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and FacilityName IN ('${query.facility - .toString() - .replace(/,/g, "','")}')` + uptakeByAgeSex.andWhere('FacilityName IN (:...facilities)', { facilities: query.facility }); } + if (query.partner) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and PartnerName IN ('${query.partner - .toString() - .replace(/,/g, "','")}')`; + uptakeByAgeSex.andWhere('PartnerName IN (:...partners)', { partners: query.partner }); } - if (query.fromDate) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and DateTestedKey >= ${query.fromDate}01`; + let year = `${query.fromDate}`.substring(0, 4); + let month = `${query.fromDate}`.substring(4, 6); + let formattedDate = `${year}-${month}-01`; + uptakeByAgeSex.andWhere('AsOfDate >= :fromDate', { fromDate: formattedDate }); } if (query.toDate) { - uptakeByAgeSexSql = `${uptakeByAgeSexSql} and DateTestedKey <= EOMONTH('${query.toDate}01')`; + let toDate = `${query.toDate}`; + let year = toDate.substring(0, 4); + let month = toDate.substring(4, 6); + let formattedDate = `${year}-${month}-01`; + uptakeByAgeSex.andWhere('AsOfDate <= EOMONTH(:toDate)', { toDate: formattedDate }); } - uptakeByAgeSexSql = `${uptakeByAgeSexSql} GROUP BY DATIMAgeGroup, CASE WHEN Gender = 'M' THEN 'Male' WHEN Gender = 'F' THEN 'Female' ELSE Gender END`; - return await this.repository.query(uptakeByAgeSexSql, params); + return await uptakeByAgeSex + .groupBy(`AgeGroup, Gender`) + .getRawMany(); } } From 73c6e92282913137720b41b9875ec1b111c2d8f0 Mon Sep 17 00:00:00 2001 From: cbrianbet Date: Thu, 13 Jun 2024 15:56:37 +0300 Subject: [PATCH 2/3] facilityArtHtsMnch API added --- src/common/common.controller.ts | 29 ++++++++++ src/common/common.module.ts | 4 +- .../get-facility-art-hts-mnch.handler.ts | 56 +++++++++++++++++++ .../impl/get-facility-art-hts-mnch.query.ts | 7 +++ 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 src/common/queries/handlers/get-facility-art-hts-mnch.handler.ts create mode 100644 src/common/queries/impl/get-facility-art-hts-mnch.query.ts diff --git a/src/common/common.controller.ts b/src/common/common.controller.ts index 46ebf606..15a0d484 100644 --- a/src/common/common.controller.ts +++ b/src/common/common.controller.ts @@ -16,6 +16,7 @@ import { GetFacilityLinelistQuery } from './queries/impl/get-facility-linelist.q import { GetFacilityTxcurrQuery } from './queries/impl/get-facility-txcurr.query'; import { GetFacilityStatusByCountyQuery } from './queries/impl/get-facility-status-by-county.query'; import { GetFacilityByInfrastructureCountyQuery } from './queries/impl/get-facility-by-infrastructure-county.query'; +import { GetFacilityArtHtsMnchQuery } from './queries/impl/get-facility-art-hts-mnch.query'; @Controller('common') export class CommonController { @@ -454,6 +455,34 @@ export class CommonController { return this.queryBus.execute(query); } + + @Get('facilityArtHtsMnch') + async getFacilityArtHtsMnch( + @Query('county') county, + @Query('subCounty') subCounty, + @Query('facility') facility, + @Query('partner') partner, + @Query('agency') agency, + ): Promise { + const query = new GetFacilityArtHtsMnchQuery(); + if(county) { + query.county = county; + } + if(subCounty) { + query.subCounty = subCounty; + } + if(facility) { + query.facility = facility; + } + if(partner) { + query.partner = partner; + } + if(agency) { + query.agency = agency; + } + return this.queryBus.execute(query); + } + @Get('sites') async getSites(): Promise { return this.queryBus.execute(new GetSitesQuery()); diff --git a/src/common/common.module.ts b/src/common/common.module.ts index f1cff631..71f4123d 100644 --- a/src/common/common.module.ts +++ b/src/common/common.module.ts @@ -17,6 +17,7 @@ import { GetFacilityLinelistHandler } from './queries/handlers/get-facility-line import { GetFacilityTxcurrHandler } from './queries/handlers/get-facility-txcurr.handler'; import { GetFacilityStatusByCountyHandler } from './queries/handlers/get-facility-status-by-county.handler'; import { GetFacilityByInfrastructureCountyHandler } from './queries/handlers/get-facility-by-infrastructure-county.handler'; +import { GetFacilityArtHtsMnchHandler } from './queries/handlers/get-facility-art-hts-mnch.handler'; import { CommonController } from './common.controller'; import { AllEmrSites } from '../care-treatment/common/entities/all-emr-sites.model'; import { LinelistFACTART } from '../care-treatment/common/entities/linelist-fact-art.model'; @@ -42,7 +43,8 @@ import { LinelistFACTART } from '../care-treatment/common/entities/linelist-fact GetFacilityLinelistHandler, GetFacilityTxcurrHandler, GetFacilityStatusByCountyHandler, - GetFacilityByInfrastructureCountyHandler + GetFacilityByInfrastructureCountyHandler, + GetFacilityArtHtsMnchHandler ], controllers: [CommonController], }) diff --git a/src/common/queries/handlers/get-facility-art-hts-mnch.handler.ts b/src/common/queries/handlers/get-facility-art-hts-mnch.handler.ts new file mode 100644 index 00000000..ddb95247 --- /dev/null +++ b/src/common/queries/handlers/get-facility-art-hts-mnch.handler.ts @@ -0,0 +1,56 @@ +import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { AllEmrSites } from '../../../care-treatment/common/entities/all-emr-sites.model'; +import { GetFacilityArtHtsMnchQuery } from '../impl/get-facility-art-hts-mnch.query'; + +@QueryHandler(GetFacilityArtHtsMnchQuery) +export class GetFacilityArtHtsMnchHandler implements IQueryHandler { + constructor( + @InjectRepository(AllEmrSites, 'mssql') + private readonly repository: Repository, + ) {} + + async execute(query: GetFacilityArtHtsMnchQuery): Promise { + const facilitiesLineList = this.repository + .createQueryBuilder('q') + .select([ + 'q.KEPH_Level', + 'q.MFLCode as SiteCode', + 'ISNULL(dhis_CT.CurrentOnART_Total, 0) as CurrentOnART_Total', + 'ISNULL(KHIS_HTS.Tested_Total, 0) as Tested_Total', + 'ISNULL(KHIS_PMTCT.onMaternalHAARTtotal, 0) as onMaternalHAARTtotal' + ]) + .leftJoin( + `(SELECT SiteCode, CurrentOnART_Total, ReportMonth_Year as reporting_month_CT FROM ODS.dbo.CT_DHIS2 dhis WHERE CurrentOnART_Total IS NOT NULL AND DATEDIFF(mm, CAST(CONCAT(ReportMonth_Year, '01') AS DATE), (SELECT MAX(CAST(CONCAT(ReportMonth_Year, '01') AS DATE)) FROM ODS.dbo.CT_DHIS2)) = 0 GROUP BY SiteCode, ReportMonth_Year, CurrentOnART_Total)`, + 'dhis_CT', + 'q.MFLCode = dhis_CT.SiteCode' + ) + .leftJoin( + `(SELECT SiteCode, Tested_Total, ReportMonth_Year as reporting_month_HTS FROM ODS.dbo.HTS_DHIS2 dhis WHERE Tested_Total IS NOT NULL AND DATEDIFF(mm, CAST(CONCAT(ReportMonth_Year, '01') AS DATE), (SELECT MAX(CAST(CONCAT(ReportMonth_Year, '01') AS DATE)) FROM ODS.dbo.HTS_DHIS2)) = 0 GROUP BY SiteCode, ReportMonth_Year, Tested_Total)`, + 'KHIS_HTS', + 'q.MFLCode = KHIS_HTS.SiteCode' + ) + .leftJoin( + `(SELECT SiteCode, onMaternalHAARTtotal, ReportMonth_Year as reporting_month_PMTCT FROM ODS.dbo.MNCH_DHIS2 dhis WHERE onMaternalHAARTtotal IS NOT NULL AND DATEDIFF(mm, CAST(CONCAT(ReportMonth_Year, '01') AS DATE), (SELECT MAX(CAST(CONCAT(ReportMonth_Year, '01') AS DATE)) FROM ODS.dbo.HTS_DHIS2)) = 0 GROUP BY SiteCode, ReportMonth_Year, onMaternalHAARTtotal)`, + 'KHIS_PMTCT', + 'q.MFLCode = KHIS_PMTCT.SiteCode' + ); + + if (query.county) { + facilitiesLineList.andWhere('q.County IN (:...county)', { + county: [query.county], + }); + } + + if (query.subCounty) { + facilitiesLineList.andWhere('q.SubCounty IN (:...subCounty)', { + subCounty: [query.subCounty], + }); + } + + return await facilitiesLineList + .orderBy('q.MFLCode') + .getRawMany(); + } +} diff --git a/src/common/queries/impl/get-facility-art-hts-mnch.query.ts b/src/common/queries/impl/get-facility-art-hts-mnch.query.ts new file mode 100644 index 00000000..36bff743 --- /dev/null +++ b/src/common/queries/impl/get-facility-art-hts-mnch.query.ts @@ -0,0 +1,7 @@ +export class GetFacilityArtHtsMnchQuery { + county?: string[]; + subCounty?: string[]; + facility?: string[]; + partner?: string[]; + agency?: string[]; +} \ No newline at end of file From bf5bc4a5824a5982fba043407596099177ab2f62 Mon Sep 17 00:00:00 2001 From: cbrianbet Date: Wed, 19 Jun 2024 14:59:26 +0300 Subject: [PATCH 3/3] ehts apis added --- src/common/common.controller.ts | 29 ++++++++++ src/common/common.module.ts | 4 +- .../get-county-coverage-hts.handler.ts | 53 +++++++++++++++++++ .../impl/get-county-coverage-hts.query.ts | 7 +++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/common/queries/handlers/get-county-coverage-hts.handler.ts create mode 100644 src/common/queries/impl/get-county-coverage-hts.query.ts diff --git a/src/common/common.controller.ts b/src/common/common.controller.ts index 15a0d484..d32fd73b 100644 --- a/src/common/common.controller.ts +++ b/src/common/common.controller.ts @@ -17,6 +17,7 @@ import { GetFacilityTxcurrQuery } from './queries/impl/get-facility-txcurr.query import { GetFacilityStatusByCountyQuery } from './queries/impl/get-facility-status-by-county.query'; import { GetFacilityByInfrastructureCountyQuery } from './queries/impl/get-facility-by-infrastructure-county.query'; import { GetFacilityArtHtsMnchQuery } from './queries/impl/get-facility-art-hts-mnch.query'; +import { GetCountyCoverageHtsQuery } from './queries/impl/get-county-coverage-hts.query'; @Controller('common') export class CommonController { @@ -483,6 +484,34 @@ export class CommonController { return this.queryBus.execute(query); } + + @Get('getCountyCoverageHts') + async getCountyCoverageHts( + @Query('county') county, + @Query('subCounty') subCounty, + @Query('facility') facility, + @Query('partner') partner, + @Query('agency') agency, + ): Promise { + const query = new GetCountyCoverageHtsQuery(); + if(county) { + query.county = county; + } + if(subCounty) { + query.subCounty = subCounty; + } + if(facility) { + query.facility = facility; + } + if(partner) { + query.partner = partner; + } + if(agency) { + query.agency = agency; + } + return this.queryBus.execute(query); + } + @Get('sites') async getSites(): Promise { return this.queryBus.execute(new GetSitesQuery()); diff --git a/src/common/common.module.ts b/src/common/common.module.ts index 71f4123d..0db5a589 100644 --- a/src/common/common.module.ts +++ b/src/common/common.module.ts @@ -18,6 +18,7 @@ import { GetFacilityTxcurrHandler } from './queries/handlers/get-facility-txcurr import { GetFacilityStatusByCountyHandler } from './queries/handlers/get-facility-status-by-county.handler'; import { GetFacilityByInfrastructureCountyHandler } from './queries/handlers/get-facility-by-infrastructure-county.handler'; import { GetFacilityArtHtsMnchHandler } from './queries/handlers/get-facility-art-hts-mnch.handler'; +import { GetCountyCoverageHtsHandler } from './queries/handlers/get-county-coverage-hts.handler'; import { CommonController } from './common.controller'; import { AllEmrSites } from '../care-treatment/common/entities/all-emr-sites.model'; import { LinelistFACTART } from '../care-treatment/common/entities/linelist-fact-art.model'; @@ -44,7 +45,8 @@ import { LinelistFACTART } from '../care-treatment/common/entities/linelist-fact GetFacilityTxcurrHandler, GetFacilityStatusByCountyHandler, GetFacilityByInfrastructureCountyHandler, - GetFacilityArtHtsMnchHandler + GetFacilityArtHtsMnchHandler, + GetCountyCoverageHtsHandler ], controllers: [CommonController], }) diff --git a/src/common/queries/handlers/get-county-coverage-hts.handler.ts b/src/common/queries/handlers/get-county-coverage-hts.handler.ts new file mode 100644 index 00000000..ab58fc9f --- /dev/null +++ b/src/common/queries/handlers/get-county-coverage-hts.handler.ts @@ -0,0 +1,53 @@ +import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { AllEmrSites } from '../../../care-treatment/common/entities/all-emr-sites.model'; +import { GetCountyCoverageHtsQuery } from '../impl/get-county-coverage-hts.query'; + +@QueryHandler(GetCountyCoverageHtsQuery) +export class GetCountyCoverageHtsHandler implements IQueryHandler { + constructor( + @InjectRepository(AllEmrSites, 'mssql') + private readonly repository: Repository, + ) {} + + async execute(query: GetCountyCoverageHtsQuery): Promise { + const htsCountyCoverage = this.repository + .createQueryBuilder('q') + .select([ + 'q.County', + 'COALESCE(SUM(Tested_Total), 0) AS Tested_DHIS', + 'coalesce (Sum(Tested),0) as Tested_NDW', + 'coalesce (Sum(Positive_Total),0) as Positive_DHIS', + 'coalesce (Sum(Positive),0) as Positive_NDW' + ]) + .leftJoin( + `(Select MFLCode, sum (Tested) as Tested, sum (Positive) as Positive, AsOfDate FROM REPORTING.dbo.AggregateHTSUptake WHERE AsOfDate =EOMONTH(DATEADD(mm,-1,GETDATE())) group by MFLcode,AsOfDate)`, + 'ndw', + 'q.MFLCode = ndw.MFLCode' + ) + .leftJoin( + `(Select MFLCode, ReportMonth_Year as reporting_month_HTS, Tested_Total, Positive_Total FROM REPORTING.dbo.AggregateFACT_HTS_DHIS2 dhis where Tested_Total is not null and datediff( mm, cast(concat(ReportMonth_Year, '01') as date), (select max(cast(concat(ReportMonth_Year, '01') as date)) from ODS.dbo.HTS_DHIS2)) = 0 group by MFLCode, ReportMonth_Year, Tested_Total, Positive_Total)`, + 'hts', + 'q.MFLCode = hts.MFLCode' + ) + .where(`EMR_Status='Active'`); + + if (query.county) { + htsCountyCoverage.andWhere('q.County IN (:...county)', { + county: [query.county], + }); + } + + if (query.subCounty) { + htsCountyCoverage.andWhere('q.SubCounty IN (:...subCounty)', { + subCounty: [query.subCounty], + }); + } + + return await htsCountyCoverage + .groupBy('q.County') + .orderBy('q.County') + .getRawMany(); + } +} diff --git a/src/common/queries/impl/get-county-coverage-hts.query.ts b/src/common/queries/impl/get-county-coverage-hts.query.ts new file mode 100644 index 00000000..547d53cb --- /dev/null +++ b/src/common/queries/impl/get-county-coverage-hts.query.ts @@ -0,0 +1,7 @@ +export class GetCountyCoverageHtsQuery { + county?: string[]; + subCounty?: string[]; + facility?: string[]; + partner?: string[]; + agency?: string[]; +} \ No newline at end of file