feat: adiciona filtro de cobrança e converte para query builder no deb.repository
This commit is contained in:
34
src/orders/application/deb.service.ts
Normal file
34
src/orders/application/deb.service.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
|
||||
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
|
||||
import { DebRepository } from '../repositories/deb.repository';
|
||||
import { DebDto } from '../dto/DebDto';
|
||||
|
||||
@Injectable()
|
||||
export class DebService {
|
||||
constructor(
|
||||
private readonly debRepository: DebRepository,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Busca débitos por CPF ou CGCENT
|
||||
* @param cpfCgcent - CPF ou CGCENT do cliente
|
||||
* @param matricula - Matrícula do funcionário (opcional)
|
||||
* @param cobranca - Código de cobrança (opcional)
|
||||
* @returns Lista de débitos do cliente
|
||||
*/
|
||||
async findByCpfCgcent(cpfCgcent: string, matricula?: number, cobranca?: string): Promise<DebDto[]> {
|
||||
if (!cpfCgcent) {
|
||||
throw new HttpException('CPF/CGCENT é obrigatório', HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await this.debRepository.findByCpfCgcent(cpfCgcent, matricula, cobranca);
|
||||
return result as DebDto[];
|
||||
} catch (error) {
|
||||
throw new HttpException(
|
||||
error.message || 'Erro ao buscar débitos',
|
||||
error.status || HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
49
src/orders/controllers/deb.controller.ts
Normal file
49
src/orders/controllers/deb.controller.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Query,
|
||||
UsePipes,
|
||||
HttpException,
|
||||
HttpStatus,
|
||||
ValidationPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiOperation, ApiTags, ApiResponse } from '@nestjs/swagger';
|
||||
import { DebService } from '../application/deb.service';
|
||||
import { DebDto } from '../dto/DebDto';
|
||||
import { FindDebDto } from '../dto/find-deb.dto';
|
||||
|
||||
@ApiTags('Débitos')
|
||||
@Controller('api/v1/deb')
|
||||
export class DebController {
|
||||
constructor(private readonly debService: DebService) {}
|
||||
|
||||
@Get('find-by-cpf')
|
||||
@ApiOperation({
|
||||
summary: 'Busca débitos por CPF/CGCENT',
|
||||
description: 'Busca débitos de um cliente usando CPF ou CGCENT. Opcionalmente pode filtrar por matrícula do funcionário ou código de cobrança.',
|
||||
})
|
||||
@ApiResponse({
|
||||
status: 200,
|
||||
description: 'Lista de débitos retornada com sucesso',
|
||||
type: [DebDto],
|
||||
})
|
||||
@ApiResponse({
|
||||
status: 400,
|
||||
description: 'CPF/CGCENT é obrigatório',
|
||||
})
|
||||
@UsePipes(new ValidationPipe({ transform: true }))
|
||||
async findByCpfCgcent(
|
||||
@Query() query: FindDebDto,
|
||||
): Promise<DebDto[]> {
|
||||
try {
|
||||
return await this.debService.findByCpfCgcent(query.cpfCgcent, query.matricula, query.cobranca);
|
||||
} catch (error) {
|
||||
throw new HttpException(
|
||||
error.message || 'Erro ao buscar débitos',
|
||||
error.status || HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
34
src/orders/dto/find-deb.dto.ts
Normal file
34
src/orders/dto/find-deb.dto.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
||||
import { IsString, IsNumber, IsNotEmpty, IsOptional, MinLength } from 'class-validator';
|
||||
import { Type } from 'class-transformer';
|
||||
|
||||
export class FindDebDto {
|
||||
@IsNotEmpty({ message: 'CPF/CGCENT é obrigatório' })
|
||||
@IsString({ message: 'CPF/CGCENT deve ser uma string' })
|
||||
@MinLength(11, { message: 'CPF/CGCENT deve ter no mínimo 11 caracteres' })
|
||||
@ApiProperty({
|
||||
description: 'CPF ou CGCENT do cliente',
|
||||
example: '70290642167',
|
||||
minLength: 11,
|
||||
})
|
||||
cpfCgcent: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsNumber({}, { message: 'Matrícula deve ser um número' })
|
||||
@Type(() => Number)
|
||||
@ApiPropertyOptional({
|
||||
description: 'Matrícula do funcionário (opcional)',
|
||||
example: 1498,
|
||||
type: Number,
|
||||
})
|
||||
matricula?: number;
|
||||
|
||||
@IsOptional()
|
||||
@IsString({ message: 'Cobrança deve ser uma string' })
|
||||
@ApiPropertyOptional({
|
||||
description: 'Código de cobrança (opcional)',
|
||||
example: 'BOL',
|
||||
})
|
||||
cobranca?: string;
|
||||
}
|
||||
|
||||
67
src/orders/repositories/deb.repository.ts
Normal file
67
src/orders/repositories/deb.repository.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { InjectDataSource } from '@nestjs/typeorm';
|
||||
|
||||
@Injectable()
|
||||
export class DebRepository {
|
||||
constructor(
|
||||
@InjectDataSource("oracle") private readonly oracleDataSource: DataSource,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Busca débitos por CPF/CGCENT
|
||||
* @param cpfCgcent - CPF ou CGCENT do cliente
|
||||
* @param matricula - Matrícula do funcionário (opcional)
|
||||
* @param cobranca - Código de cobrança (opcional)
|
||||
* @returns Lista de débitos do cliente
|
||||
*/
|
||||
async findByCpfCgcent(cpfCgcent: string, matricula?: number, cobranca?: string) {
|
||||
const queryRunner = this.oracleDataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const queryBuilder = queryRunner.manager
|
||||
.createQueryBuilder()
|
||||
.select([
|
||||
'p.dtemissao AS "dtemissao"',
|
||||
'p.codfilial AS "codfilial"',
|
||||
'p.duplic AS "duplic"',
|
||||
'p.prest AS "prest"',
|
||||
'p.codcli AS "codcli"',
|
||||
'c.cliente AS "cliente"',
|
||||
'p.codcob AS "codcob"',
|
||||
'cb.cobranca AS "cobranca"',
|
||||
'p.dtvenc AS "dtvenc"',
|
||||
'p.dtpag AS "dtpag"',
|
||||
'p.valor AS "valor"',
|
||||
`CASE
|
||||
WHEN p.dtpag IS NOT NULL THEN 'PAGO'
|
||||
WHEN p.dtvenc < TRUNC(SYSDATE) THEN 'EM ATRASO'
|
||||
WHEN p.dtvenc >= TRUNC(SYSDATE) THEN 'A VENCER'
|
||||
ELSE 'NENHUM'
|
||||
END AS "situacao"`,
|
||||
])
|
||||
.from('pcprest', 'p')
|
||||
.innerJoin('pcclient', 'c', 'p.codcli = c.codcli')
|
||||
.innerJoin('pccob', 'cb', 'p.codcob = cb.codcob')
|
||||
.innerJoin('pcempr', 'e', 'c.cgcent = e.cpf')
|
||||
.where('p.codcob NOT IN (:...excludedCob)', { excludedCob: ['DESD', 'CANC'] })
|
||||
.andWhere('c.cgcent = :cpfCgcent', { cpfCgcent });
|
||||
|
||||
if (matricula) {
|
||||
queryBuilder.andWhere('e.matricula = :matricula', { matricula });
|
||||
}
|
||||
|
||||
if (cobranca) {
|
||||
queryBuilder.andWhere('p.codcob = :cobranca', { cobranca });
|
||||
}
|
||||
|
||||
queryBuilder.orderBy('p.dtvenc', 'ASC');
|
||||
|
||||
const result = await queryBuilder.getRawMany();
|
||||
return result;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user