Skip to content

Commit

Permalink
Merge pull request #437 from RJ-SMTR/hotfix/427-sincronismo
Browse files Browse the repository at this point in the history
(prod) fix: update TransacaoView with value = 0
  • Loading branch information
williamfl2007 committed Aug 29, 2024
2 parents 22a650a + 675c3b6 commit 510ec1c
Show file tree
Hide file tree
Showing 8 changed files with 290 additions and 166 deletions.
152 changes: 152 additions & 0 deletions src/cnab/cnab-manutencao.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
import { BadRequestException, Controller, Get, HttpCode, HttpStatus, ParseArrayPipe, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Roles } from 'src/roles/roles.decorator';
import { RoleEnum } from 'src/roles/roles.enum';
import { RolesGuard } from 'src/roles/roles.guard';
import { ApiDescription } from 'src/utils/api-param/description-api-param';
import { CustomLogger } from 'src/utils/custom-logger';
import { ParseDatePipe } from 'src/utils/pipes/parse-date.pipe';
import { ParseListPipe } from 'src/utils/pipes/parse-list.pipe';
import { ParseNumberPipe } from 'src/utils/pipes/parse-number.pipe';
import { CnabService } from './cnab.service';

@ApiTags('Manutenção')
@Controller({
path: 'manutencao/cnab',
version: '1',
})
export class CnabManutencaoController {
private logger = new CustomLogger(CnabManutencaoController.name, { timestamp: true });

constructor(private readonly cnabService: CnabService) {}

@Get('generateRemessa')
@HttpCode(HttpStatus.OK)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.master)
@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nExecuta a geração e envio de remessa - que normalmente é feita via cronjob' })
@ApiQuery({ name: 'dataOrdemInicial', description: ApiDescription({ _: 'Data da Ordem de Pagamento Inicial - salvar transações', example: '2024-07-15' }), required: true, type: String })
@ApiQuery({ name: 'dataOrdemFinal', description: ApiDescription({ _: 'Data da Ordem de Pagamento Final - salvar transações', example: '2024-07-16' }), required: true, type: String })
@ApiQuery({ name: 'diasAnterioresOrdem', description: ApiDescription({ _: 'Procurar também por dias Anteriores a dataOrdemInicial - salvar transações', default: 0 }), required: false, type: Number, example: 7 })
@ApiQuery({ name: 'consorcio', description: 'Nome do consorcio - salvar transações', required: true, type: String, example: 'Todos / Van / Empresa /Nome Consorcio' })
@ApiQuery({ name: 'dt_pagamento', description: ApiDescription({ _: 'Data Pagamento', default: 'O dia de hoje' }), required: false, type: String })
@ApiQuery({ name: 'isConference', description: 'Conferencia - Se o remessa será gerado numa tabela de teste.', required: true, type: Boolean, example: true })
@ApiQuery({ name: 'isCancelamento', description: 'Cancelamento', required: true, type: Boolean, example: false })
@ApiQuery({ name: 'nsaInicial', description: ApiDescription({ default: 'O NSA atual' }), required: false, type: Number })
@ApiQuery({ name: 'nsaFinal', description: ApiDescription({ default: 'nsaInicial' }), required: false, type: Number })
@ApiQuery({ name: 'dataCancelamento', description: ApiDescription({ _: 'Data de vencimento da transação a ser cancelada (DetalheA).', 'Required if': 'isCancelamento = true' }), required: false, type: String, example: '2024-07-16' })
@ApiBearerAuth()
async getGenerateRemessa(
@Query('dataOrdemInicial', new ParseDatePipe({ transform: true })) _dataOrdemInicial: any, // Date
@Query('dataOrdemFinal', new ParseDatePipe({ transform: true })) _dataOrdemFinal: any, // Date
@Query('diasAnterioresOrdem', new ParseNumberPipe({ min: 0, defaultValue: 0 })) diasAnteriores: number,
@Query('consorcio') consorcio: string,
@Query('dt_pagamento', new ParseDatePipe({ transform: true, optional: true })) _dataPgto: any, // Date | undefined
@Query('isConference') isConference: boolean,
@Query('isCancelamento') isCancelamento: boolean,
@Query('nsaInicial', new ParseNumberPipe({ min: 1, optional: true })) nsaInicial: number | undefined,
@Query('nsaFinal', new ParseNumberPipe({ min: 1, optional: true })) nsaFinal: number | undefined,
@Query('dataCancelamento', new ParseDatePipe({ transform: true, optional: true })) _dataCancelamento: any, // Date | undefined
) {
const dataOrdemInicial = _dataOrdemInicial as Date;
const dataOrdemFinal = _dataOrdemFinal as Date;
const dataPgto = _dataOrdemFinal as Date | undefined;
const dataCancelamento = _dataCancelamento as Date | undefined;

if (isCancelamento && !dataCancelamento) {
throw new BadRequestException('dataCancelamento é obrigatório se isCancelamento = true');
}

return await this.cnabService.getGenerateRemessa({
dataOrdemInicial,
dataOrdemFinal,
diasAnteriores,
consorcio,
dataPgto,
isConference,
isCancelamento,
nsaInicial,
nsaFinal,
dataCancelamento,
});
}

@Get('updateRetorno')
@HttpCode(HttpStatus.OK)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.master)
@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nExecuta a leitura do retorno - que normalmente é feita via cronjob' })
@ApiBearerAuth()
@ApiQuery({ name: 'folder', description: ApiDescription({ _: 'Pasta para ler os retornos', default: '`/retorno`' }), required: false, type: String })
@ApiQuery({ name: 'maxItems', description: ApiDescription({ _: 'Número máximo de itens para ler', min: 1 }), required: false, type: Number })
async getUpdateRetorno(
@Query('folder') folder: string | undefined, //
@Query('maxItems', new ParseNumberPipe({ min: 1, optional: true })) maxItems: number | undefined,
) {
return await this.cnabService.updateRetorno(folder, maxItems);
}

@Get('syncTransacaoViewOrdemPgto')
@HttpCode(HttpStatus.OK)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.master)
@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nExecuta o sincronismo de TransacaoView com as OrdensPagamento (ItemTransacaoAgrupado) - que normalmente é feia via cronjob' })
@ApiQuery({ name: 'dataOrdemInicial', type: Date, required: false, description: 'Data da Ordem de Pagamento Inicial' })
@ApiQuery({ name: 'dataOrdemFinal', type: Date, required: false, description: 'Data da Ordem de Pagamento Final' })
@ApiQuery({ name: 'nomeFavorecido', type: String, required: false, description: 'Lista de nomes dos favorecidos' })
@ApiBearerAuth()
async getSyncTransacaoViewOrdemPgto(
@Query('dataOrdemInicial', new ParseDatePipe({ transform: true, optional: true })) dataOrdemInicial: Date | undefined, //
@Query('dataOrdemFinal', new ParseDatePipe({ transform: true, optional: true })) dataOrdemFinal: Date | undefined,
@Query('nomeFavorecido', new ParseListPipe({ transform: true, optional: true })) nomeFavorecido: string[] | undefined,
) {
const dataOrdem_between = dataOrdemInicial && dataOrdemFinal && ([dataOrdemInicial, dataOrdemFinal] as [Date, Date]);
return await this.cnabService.syncTransacaoViewOrdemPgto({ dataOrdem_between, nomeFavorecido });
}

@Get('updateTransacaoViewBigquery')
@HttpCode(HttpStatus.OK)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.master)
@ApiOperation({ description: 'Atualiza TransacaoView do Bigquery' })
@ApiBearerAuth()
@ApiQuery({ name: 'dataOrdemInicial', type: Date, required: true, description: 'Data da Ordem de Pagamento Inicial' })
@ApiQuery({ name: 'dataOrdemFinal', type: Date, required: true, description: 'Data da Ordem de Pagamento Final' })
@ApiQuery({ name: 'consorcio', type: String, required: false, description: ApiDescription({ _: 'Nome do consorcio - salvar transações', default: 'Todos' }), example: 'Todos / Van / Empresa /Nome Consorcio' })
@ApiQuery({ name: 'idTransacao', type: String, required: false, description: 'Lista de idTransacao para atualizar' })
async getUpdateTransacaoViewBigquery(
@Query('dataOrdemInicial', new ParseDatePipe({ transform: true })) dataOrdemInicial: any, //
@Query('dataOrdemFinal', new ParseDatePipe({ transform: true })) dataOrdemFinal: any,
@Query('consorcio') consorcio: string | undefined,
@Query('idTransacao', new ParseArrayPipe({ items: String, separator: ',', optional: true })) idTransacao: string[], //
) {
const _dataOrdemInicial: Date = dataOrdemInicial;
const _dataOrdemFinal: Date = dataOrdemFinal;
const _consorcio = consorcio || 'Todos';
return await this.cnabService.updateTransacaoViewBigquery(_dataOrdemInicial, _dataOrdemFinal, 0, _consorcio, idTransacao);
}

@Get('deduplicateTransacaoView')
@HttpCode(HttpStatus.OK)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.master)
@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nRemove duplicatas de TransacaoView' })
@ApiBearerAuth()
async getDeduplicateTransacaoView() {
return await this.cnabService.deduplicateTransacaoView();
}

@Get('updateTransacaoViewBigqueryValues')
@HttpCode(HttpStatus.OK)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.master)
@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nAtualiza os valores de TransacaoView existentes a a partir do Bigquery.' })
@ApiBearerAuth()
@ApiQuery({ name: 'diasAnteriores', type: Number, required: false, description: 'Atualizar apenas os itens até N dias atrás' })
async getUpdateTransacaoViewBigqueryValues(
@Query('diasAnteriores', new ParseNumberPipe({ optional: true })) diasAnteriores: number | undefined, //
) {
return await this.cnabService.updateTransacaoViewBigqueryValues(diasAnteriores);
}
}
135 changes: 2 additions & 133 deletions src/cnab/cnab.controller.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,19 @@
import { BadRequestException, Controller, Get, HttpCode, HttpStatus, ParseArrayPipe, Query, UseGuards } from '@nestjs/common';
import { Controller, Get, HttpCode, HttpStatus, ParseArrayPipe, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Roles } from 'src/roles/roles.decorator';
import { RoleEnum } from 'src/roles/roles.enum';
import { RolesGuard } from 'src/roles/roles.guard';
import { ApiDescription } from 'src/utils/api-param/description-api-param';
import { CustomLogger } from 'src/utils/custom-logger';
import { ParseDatePipe } from 'src/utils/pipes/parse-date.pipe';
import { ParseNumberPipe } from 'src/utils/pipes/parse-number.pipe';
import { CnabService } from './cnab.service';
import { ClienteFavorecido } from './entity/cliente-favorecido.entity';
import { PagadorContaEnum } from './enums/pagamento/pagador.enum';
import { ArquivoPublicacaoService } from './service/arquivo-publicacao.service';
import { ClienteFavorecidoService } from './service/cliente-favorecido.service';
import { ExtratoDto } from './service/dto/extrato.dto';
import { ExtratoHeaderArquivoService } from './service/extrato/extrato-header-arquivo.service';
import { ParseListPipe } from 'src/utils/pipes/parse-list.pipe';
import { CommonHttpException } from 'src/utils/http-exception/common-http-exception';
import { CustomLogger } from 'src/utils/custom-logger';
import { formatDateInterval } from 'src/utils/date-utils';

@ApiTags('Cnab')
@Controller({
Expand All @@ -31,7 +27,6 @@ export class CnabController {
private readonly clienteFavorecidoService: ClienteFavorecidoService, //
private readonly extratoHeaderArquivoService: ExtratoHeaderArquivoService,
private readonly arquivoPublicacaoService: ArquivoPublicacaoService,
private readonly cnabService: CnabService,
) {}

@Get('clientes-favorecidos')
Expand Down Expand Up @@ -84,130 +79,4 @@ export class CnabController {
const result = await this.arquivoPublicacaoService.findManyByDate(dataInicio, dataFim, limit, page);
return result;
}

@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nExecuta a geração e envio de remessa - que normalmente é feita via cronjob' })
@ApiQuery({ name: 'dataOrdemInicial', description: ApiDescription({ _: 'Data da Ordem de Pagamento Inicial - salvar transações', example: '2024-07-15' }), required: true, type: String })
@ApiQuery({ name: 'dataOrdemFinal', description: ApiDescription({ _: 'Data da Ordem de Pagamento Final - salvar transações', example: '2024-07-16' }), required: true, type: String })
@ApiQuery({ name: 'diasAnterioresOrdem', description: ApiDescription({ _: 'Procurar também por dias Anteriores a dataOrdemInicial - salvar transações', default: 0 }), required: false, type: Number, example: 7 })
@ApiQuery({ name: 'consorcio', description: 'Nome do consorcio - salvar transações', required: true, type: String, example: 'Todos / Van / Empresa /Nome Consorcio' })
@ApiQuery({ name: 'dt_pagamento', description: ApiDescription({ _: 'Data Pagamento', default: 'O dia de hoje' }), required: false, type: String })
@ApiQuery({ name: 'isConference', description: 'Conferencia - Se o remessa será gerado numa tabela de teste.', required: true, type: Boolean, example: true })
@ApiQuery({ name: 'isCancelamento', description: 'Cancelamento', required: true, type: Boolean, example: false })
@ApiQuery({ name: 'nsaInicial', description: ApiDescription({ default: 'O NSA atual' }), required: false, type: Number })
@ApiQuery({ name: 'nsaFinal', description: ApiDescription({ default: 'nsaInicial' }), required: false, type: Number })
@ApiQuery({ name: 'dataCancelamento', description: ApiDescription({ _: 'Data de vencimento da transação a ser cancelada (DetalheA).', 'Required if': 'isCancelamento = true' }), required: false, type: String, example: '2024-07-16' })
@HttpCode(HttpStatus.OK)
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.admin)
@Get('generateRemessa')
async getGenerateRemessa(
@Query('dataOrdemInicial', new ParseDatePipe({ transform: true })) _dataOrdemInicial: any, // Date
@Query('dataOrdemFinal', new ParseDatePipe({ transform: true })) _dataOrdemFinal: any, // Date
@Query('diasAnterioresOrdem', new ParseNumberPipe({ min: 0, defaultValue: 0 })) diasAnteriores: number,
@Query('consorcio') consorcio: string,
@Query('dt_pagamento', new ParseDatePipe({ transform: true, optional: true })) _dataPgto: any, // Date | undefined
@Query('isConference') isConference: boolean,
@Query('isCancelamento') isCancelamento: boolean,
@Query('nsaInicial', new ParseNumberPipe({ min: 1, optional: true })) nsaInicial: number | undefined,
@Query('nsaFinal', new ParseNumberPipe({ min: 1, optional: true })) nsaFinal: number | undefined,
@Query('dataCancelamento', new ParseDatePipe({ transform: true, optional: true })) _dataCancelamento: any, // Date | undefined
) {
const dataOrdemInicial = _dataOrdemInicial as Date;
const dataOrdemFinal = _dataOrdemFinal as Date;
const dataPgto = _dataOrdemFinal as Date | undefined;
const dataCancelamento = _dataCancelamento as Date | undefined;

if (isCancelamento && !dataCancelamento) {
throw new BadRequestException('dataCancelamento é obrigatório se isCancelamento = true');
}

return await this.cnabService.getGenerateRemessa({
dataOrdemInicial,
dataOrdemFinal,
diasAnteriores,
consorcio,
dataPgto,
isConference,
isCancelamento,
nsaInicial,
nsaFinal,
dataCancelamento,
});
}

@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nExecuta a leitura do retorno - que normalmente é feita via cronjob' })
@ApiQuery({ name: 'folder', description: ApiDescription({ _: 'Pasta para ler os retornos', default: '`/retorno`' }), required: false, type: String })
@ApiQuery({ name: 'maxItems', description: ApiDescription({ _: 'Número máximo de itens para ler', min: 1 }), required: false, type: Number })
@HttpCode(HttpStatus.OK)
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.admin)
@Get('updateRetorno')
async getUpdateRetorno(
@Query('folder') folder: string | undefined, //
@Query('maxItems', new ParseNumberPipe({ min: 1, optional: true })) maxItems: number | undefined,
) {
return await this.cnabService.updateRetorno(folder, maxItems);
}

@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nExecuta o sincronismo de TransacaoView com as OrdensPagamento (ItemTransacaoAgrupado) - que normalmente é feia via cronjob' })
@ApiQuery({ name: 'dataOrdemInicial', description: 'Data da Ordem de Pagamento Inicial', required: false, type: Date })
@ApiQuery({ name: 'dataOrdemFinal', description: 'Data da Ordem de Pagamento Final', required: false, type: Date })
@ApiQuery({ name: 'nomeFavorecido', description: 'Lista de nomes dos favorecidos', required: false, type: String })
@HttpCode(HttpStatus.OK)
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.admin)
@Get('syncTransacaoViewOrdemPgto')
async getSyncTransacaoViewOrdemPgto(
@Query('dataOrdemInicial', new ParseDatePipe({ transform: true, optional: true })) dataOrdemInicial: Date | undefined, //
@Query('dataOrdemFinal', new ParseDatePipe({ transform: true, optional: true })) dataOrdemFinal: Date | undefined,
@Query('nomeFavorecido', new ParseListPipe({ transform: true, optional: true })) nomeFavorecido: string[] | undefined,
) {
const dataOrdem_between = dataOrdemInicial && dataOrdemFinal && ([dataOrdemInicial, dataOrdemFinal] as [Date, Date]);
return await this.cnabService.syncTransacaoViewOrdemPgto({ dataOrdem_between, nomeFavorecido });
}

@Get('updateTransacaoViewBigquery')
@HttpCode(HttpStatus.OK)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.admin)
@ApiOperation({ description: 'Atualiza TransacaoView do Bigquery' })
@ApiBearerAuth()
@ApiQuery({ name: 'dataOrdemInicial', description: 'Data da Ordem de Pagamento Inicial', required: true, type: Date })
@ApiQuery({ name: 'dataOrdemFinal', description: 'Data da Ordem de Pagamento Final', required: true, type: Date })
@ApiQuery({ name: 'consorcio', description: ApiDescription({ _: 'Nome do consorcio - salvar transações', default: 'Todos' }), required: false, type: String, example: 'Todos / Van / Empresa /Nome Consorcio' })
@ApiQuery({ name: 'idTransacao', description: 'Lista de idTransacao para atualizar', required: false, type: String })
async getUpdateTransacaoViewBigquery(
@Query('dataOrdemInicial', new ParseDatePipe({ transform: true })) dataOrdemInicial: any, //
@Query('dataOrdemFinal', new ParseDatePipe({ transform: true })) dataOrdemFinal: any,
@Query('consorcio') consorcio: string | undefined,
@Query('idTransacao', new ParseArrayPipe({ items: String, separator: ',', optional: true })) idTransacao: string[], //
) {
const _dataOrdemInicial: Date = dataOrdemInicial;
const _dataOrdemFinal: Date = dataOrdemFinal;
const _consorcio = consorcio || 'Todos';
return await this.cnabService.updateTransacaoViewBigquery(_dataOrdemInicial, _dataOrdemFinal, 0, _consorcio, idTransacao);
}

@Get('deduplicateTransacaoView')
@HttpCode(HttpStatus.OK)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.admin)
@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nRemove duplicatas de TransacaoView' })
@ApiBearerAuth()
async getDeduplicateTransacaoView() {
return await this.cnabService.deduplicateTransacaoView();
}

@Get('updateTransacaoViewBigqueryValues')
@HttpCode(HttpStatus.OK)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles(RoleEnum.admin)
@ApiOperation({ description: 'Feito para manutenção pelos admins.\n\nAtualiza os valores de TransacaoView existentes a a partir do Bigquery.' })
@ApiBearerAuth()
async getUpdateTransacaoViewBigqueryValues() {
return await this.cnabService.updateTransacaoViewBigqueryValues();
}
}
Loading

0 comments on commit 510ec1c

Please sign in to comment.