Skip to content

Commit

Permalink
Merge pull request #750 from palladiumkenya/feat/new-reporting-layer
Browse files Browse the repository at this point in the history
his deployment apis added
  • Loading branch information
cbrianbet authored Jun 20, 2024
2 parents 5feea09 + 3770936 commit 96e82b2
Show file tree
Hide file tree
Showing 12 changed files with 384 additions and 66 deletions.
116 changes: 116 additions & 0 deletions src/common/common.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ 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';
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 {
Expand Down Expand Up @@ -396,6 +400,118 @@ 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<any> {
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<any> {
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('facilityArtHtsMnch')
async getFacilityArtHtsMnch(
@Query('county') county,
@Query('subCounty') subCounty,
@Query('facility') facility,
@Query('partner') partner,
@Query('agency') agency,
): Promise<any> {
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('getCountyCoverageHts')
async getCountyCoverageHts(
@Query('county') county,
@Query('subCounty') subCounty,
@Query('facility') facility,
@Query('partner') partner,
@Query('agency') agency,
): Promise<any> {
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<any> {
return this.queryBus.execute(new GetSitesQuery());
Expand Down
8 changes: 8 additions & 0 deletions src/common/common.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ 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 { 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';
Expand All @@ -39,6 +43,10 @@ import { LinelistFACTART } from '../care-treatment/common/entities/linelist-fact
GetFacilityByInfrastructureHandler,
GetFacilityLinelistHandler,
GetFacilityTxcurrHandler,
GetFacilityStatusByCountyHandler,
GetFacilityByInfrastructureCountyHandler,
GetFacilityArtHtsMnchHandler,
GetCountyCoverageHtsHandler
],
controllers: [CommonController],
})
Expand Down
53 changes: 53 additions & 0 deletions src/common/queries/handlers/get-county-coverage-hts.handler.ts
Original file line number Diff line number Diff line change
@@ -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<GetCountyCoverageHtsQuery> {
constructor(
@InjectRepository(AllEmrSites, 'mssql')
private readonly repository: Repository<AllEmrSites>,
) {}

async execute(query: GetCountyCoverageHtsQuery): Promise<any> {
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();
}
}
56 changes: 56 additions & 0 deletions src/common/queries/handlers/get-facility-art-hts-mnch.handler.ts
Original file line number Diff line number Diff line change
@@ -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<GetFacilityArtHtsMnchQuery> {
constructor(
@InjectRepository(AllEmrSites, 'mssql')
private readonly repository: Repository<AllEmrSites>,
) {}

async execute(query: GetFacilityArtHtsMnchQuery): Promise<any> {
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();
}
}
Original file line number Diff line number Diff line change
@@ -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<GetFacilityByInfrastructureCountyQuery> {
constructor(
@InjectRepository(AllEmrSites, 'mssql')
private readonly repository: Repository<AllEmrSites>,
) {}

async execute(query: GetFacilityByInfrastructureCountyQuery): Promise<any> {
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();
}
}
Original file line number Diff line number Diff line change
@@ -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<GetFacilityStatusByCountyQuery> {
constructor(
@InjectRepository(AllEmrSites, 'mssql')
private readonly repository: Repository<AllEmrSites>,
) {}

async execute(query: GetFacilityStatusByCountyQuery): Promise<any> {
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();
}
}
7 changes: 7 additions & 0 deletions src/common/queries/impl/get-county-coverage-hts.query.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export class GetCountyCoverageHtsQuery {
county?: string[];
subCounty?: string[];
facility?: string[];
partner?: string[];
agency?: string[];
}
7 changes: 7 additions & 0 deletions src/common/queries/impl/get-facility-art-hts-mnch.query.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export class GetFacilityArtHtsMnchQuery {
county?: string[];
subCounty?: string[];
facility?: string[];
partner?: string[];
agency?: string[];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export class GetFacilityByInfrastructureCountyQuery {
county?: string[];
subCounty?: string[];
facility?: string[];
partner?: string[];
agency?: string[];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export class GetFacilityStatusByCountyQuery {
county?: string[];
subCounty?: string[];
facility?: string[];
partner?: string[];
agency?: string[];
}
Loading

0 comments on commit 96e82b2

Please sign in to comment.