Skip to content

Commit

Permalink
feat/backend: Added new filter by client type code #34 (FSADT1-325)
Browse files Browse the repository at this point in the history
  • Loading branch information
mamartinezmejia committed Aug 26, 2022
1 parent c98a088 commit 063be4a
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,48 +5,66 @@ import { PageOptionsDto } from '../../pagination/dtos/page-option.dto';
import { ClientPublicViewService } from '../services/clientPublicView.service';

@ApiTags('Client View')
@Controller('clientPublicView')
@Controller('client')
export class ClientPublicViewController {
constructor(
private readonly clientPublicViewService: ClientPublicViewService,
) {}

@Get('/findById')
@Get('/findByNumber')
@ApiQuery({
name: 'clientNumber',
required: true,
type: String,
description: 'The number of the client'
})
findByNumber(@Query('clientNumber') clientNumber: string) {
return this.clientPublicViewService.findByNumber(clientNumber);
findByNumber(
@Query('clientNumber') clientNumber: string,
) {
return this.clientPublicViewService.findByNumber(
clientNumber
);
}

@Get('/findByName')
@ApiQuery({
name: 'clientName',
required: false,
type: String,
description: 'The name of the entity'
})
@ApiQuery({
name: 'clientFirstName',
required: false,
type: String,
description: "The client's first name"
})
@ApiQuery({
name: 'clientMiddleName',
required: false,
type: String,
description: "The client's middle name"
})
@ApiQuery({
name: 'clientTypeCodesAsCsv',
required: false,
type: String,
description: 'A code indicating a type of ministry client.<br>' +
'Examples include but are not limited to: Corporation, Individual, Association, First Nation Band...<br>' +
'Please enter one or more client type codes as CSV, i.e. C,A,B.'
})
findByName(
@Query('clientName') clientName: string,
@Query('clientFirstName') clientFirstName: string,
@Query('clientMiddleName') clientMiddleName: string,
@Query('clientTypeCodesAsCsv') clientTypeCodesAsCsv: string,
@Query() pageOptionsDto: PageOptionsDto,
) {
return this.clientPublicViewService.findByName(
return this.clientPublicViewService.findByNames(
clientName,
clientFirstName,
clientMiddleName,
clientTypeCodesAsCsv,
pageOptionsDto,
);
}
Expand Down
19 changes: 1 addition & 18 deletions backend/src/clientpublicview/entities/clientPublicView.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,22 @@ import { BaseEntity, ViewColumn, ViewEntity, PrimaryColumn } from 'typeorm';

@ViewEntity({ name: 'V_CLIENT_PUBLIC' })
export class ClientPublicViewEntity extends BaseEntity {
@ApiProperty({
description: 'The client id',
})

@PrimaryColumn({ name: 'CLIENT_NUMBER' })
clientNumber: string;

@ApiProperty({
description: 'The client name',
})
@ViewColumn({ name: 'CLIENT_NAME' })
clientName: string;

@ApiProperty({
description: 'The client first name',
})
@ViewColumn({ name: 'LEGAL_FIRST_NAME' })
legalFirstName: string;

@ApiProperty({
description: 'The client middle name',
})
@ViewColumn({ name: 'LEGAL_MIDDLE_NAME' })
legalMiddleName: string;

@ApiProperty({
description: 'The client status',
})
@ViewColumn({ name: 'CLIENT_STATUS_CODE' })
clientStatusCode: string;

@ApiProperty({
description: 'The client type',
})
@ViewColumn({ name: 'CLIENT_TYPE_CODE' })
clientTypeCode: string;

Expand Down
90 changes: 49 additions & 41 deletions backend/src/clientpublicview/services/clientPublicView.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,6 @@ export class ClientPublicViewService {
private clientPublicViewRepository: Repository<ClientPublicViewEntity>,
) {}

async findAllNonIndividuals(
pageOptionsDto: PageOptionsDto,
): Promise<PageDto<ClientPublicView>> {
const skip = (pageOptionsDto.page - 1) * pageOptionsDto.take;

const queryBuilder = this.clientPublicViewRepository
.createQueryBuilder('V_CLIENT_PUBLIC')
.where('V_CLIENT_PUBLIC.CLIENT_TYPE_CODE != :clientTypeCode', {
clientTypeCode: 'I',
});

queryBuilder
.orderBy('V_CLIENT_PUBLIC.CLIENT_NUMBER', pageOptionsDto.order)
.skip(skip)
.take(pageOptionsDto.take);

const itemCount = await queryBuilder.getCount();
const { entities } = await queryBuilder.getRawAndEntities();

const pageMetaDto = new PageMetaDto({ itemCount, pageOptionsDto });

return new PageDto(entities, pageMetaDto);
}

async findByNumber(
clientNumber: string,
): Promise<ClientPublicView[] | HttpException> {
Expand All @@ -47,39 +23,46 @@ export class ClientPublicViewService {
HttpStatus.BAD_REQUEST,
);

let sqlWhereStr = '1=1';
sqlWhereStr = sqlWhereStr + ' AND CLIENT_NUMBER = :clientNumber';

return this.clientPublicViewRepository
.createQueryBuilder('V_CLIENT_PUBLIC')
.where('V_CLIENT_PUBLIC.CLIENT_NUMBER=:clientNumber', {
clientNumber,
.where(sqlWhereStr, {
clientNumber: clientNumber,
})
.getMany();
}

async findByName(
async findByNames(
clientName: string,
clientFirstName: string,
clientMiddleName: string,
clientTypeCodesAsCsv: string,
pageOptionsDto: PageOptionsDto,
): Promise<PageDto<ClientPublicView> | HttpException> {
if (!clientName && !clientFirstName && !clientMiddleName)
if (!clientName && !clientFirstName && !clientMiddleName && !clientTypeCodesAsCsv)
return new HttpException(
'Must provide one of clientName, clientFirstName, clientMiddleName',
'Must provide at least one paramater: clientName, clientFirstName, clientMiddleName, clientTypeCode',
HttpStatus.BAD_REQUEST,
);

let sqlWhereStr = '1=1';
if (clientName && clientName !== '')
sqlWhereStr =
sqlWhereStr +
' AND LOWER(V_CLIENT_PUBLIC.CLIENT_NAME) LIKE LOWER(:clientName)';
if (clientFirstName && clientFirstName !== '')
sqlWhereStr =
sqlWhereStr +
' AND LOWER(V_CLIENT_PUBLIC.LEGAL_FIRST_NAME) LIKE LOWER(:clientFirstName)';
if (clientMiddleName && clientMiddleName !== '')
sqlWhereStr =
sqlWhereStr +
' AND LOWER(V_CLIENT_PUBLIC.LEGAL_MIDDLE_NAME) LIKE LOWER(:clientMiddleName)';
if (clientName && clientName !== '') {
sqlWhereStr = sqlWhereStr + ' AND LOWER(V_CLIENT_PUBLIC.CLIENT_NAME) LIKE LOWER(:clientName)';
}

if (clientFirstName && clientFirstName !== '') {
sqlWhereStr = sqlWhereStr + ' AND LOWER(V_CLIENT_PUBLIC.LEGAL_FIRST_NAME) LIKE LOWER(:clientFirstName)';
}

if (clientMiddleName && clientMiddleName !== '') {
sqlWhereStr = sqlWhereStr + ' AND LOWER(V_CLIENT_PUBLIC.LEGAL_MIDDLE_NAME) LIKE LOWER(:clientMiddleName)';
}

if (clientTypeCodesAsCsv && clientTypeCodesAsCsv !== '') {
sqlWhereStr = sqlWhereStr + ' AND CLIENT_TYPE_CODE IN (:...clientTypeCode)';
}

const skip = (pageOptionsDto.page - 1) * pageOptionsDto.take;

Expand All @@ -89,6 +72,31 @@ export class ClientPublicViewService {
clientName: `%${clientName}%`,
clientFirstName: `%${clientFirstName}%`,
clientMiddleName: `%${clientMiddleName}%`,
clientTypeCode: clientTypeCodesAsCsv.toUpperCase().split(',')
});

queryBuilder
.orderBy('V_CLIENT_PUBLIC.CLIENT_NUMBER', pageOptionsDto.order)
.skip(skip)
.take(pageOptionsDto.take);

const itemCount = await queryBuilder.getCount();
const { entities } = await queryBuilder.getRawAndEntities();

const pageMetaDto = new PageMetaDto({ itemCount, pageOptionsDto });

return new PageDto(entities, pageMetaDto);
}

async findAllNonIndividuals(
pageOptionsDto: PageOptionsDto,
): Promise<PageDto<ClientPublicView>> {
const skip = (pageOptionsDto.page - 1) * pageOptionsDto.take;

const queryBuilder = this.clientPublicViewRepository
.createQueryBuilder('V_CLIENT_PUBLIC')
.where('V_CLIENT_PUBLIC.CLIENT_TYPE_CODE != :clientTypeCode', {
clientTypeCode: 'I',
});

queryBuilder
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/services/forestClient.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { backendUrl, apiKey } from "../core/CoreConstants";

export const searchInViewByClientNumber = (clientNumber: string) => {
return axios
.get(backendUrl + "/clientPublicView/findById", {
.get(backendUrl + "/clientPublicView/findByNumber", {
params: { clientNumber },
headers: { "X-API-KEY": apiKey },
})
Expand Down

0 comments on commit 063be4a

Please sign in to comment.