diff --git a/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts b/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts index 7b3ff853..9f5e55ae 100644 --- a/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts +++ b/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts @@ -125,14 +125,18 @@ export class BigqueryOrdemPagamentoRepository { private getQueryArgsConsorcio(args: IBigqueryFindOrdemPagamento) { const startDate = args.startDate.toISOString().slice(0, 10); const endDate = args.endDate.toISOString().slice(0, 10); - const qWhere = `t.data_ordem BETWEEN '${startDate}' AND '${endDate}' AND o.tipo_documento = 'CNPJ'`; + const qWhere = + `t.data_ordem BETWEEN '${startDate}' AND '${endDate}' AND o.tipo_documento = 'CNPJ' ` + + 'AND t.valor_total_transacao_liquido > 0'; return qWhere; } private getQueryArgsOperadora(args: IBigqueryFindOrdemPagamento) { const startDate = args.startDate.toISOString().slice(0, 10); const endDate = args.endDate.toISOString().slice(0, 10); - const qWhere = `t.data_ordem BETWEEN '${startDate}' AND '${endDate}' AND o.tipo_documento = 'CPF'`; + const qWhere = + `t.data_ordem BETWEEN '${startDate}' AND '${endDate}' AND o.tipo_documento = 'CPF' ` + + 'AND t.valor_total_transacao_liquido > 0'; return qWhere; } } diff --git a/src/bigquery/services/bigquery-ordem-pagamento.service.ts b/src/bigquery/services/bigquery-ordem-pagamento.service.ts index 3fd93d21..54161007 100644 --- a/src/bigquery/services/bigquery-ordem-pagamento.service.ts +++ b/src/bigquery/services/bigquery-ordem-pagamento.service.ts @@ -14,16 +14,17 @@ export class BigqueryOrdemPagamentoService { ) {} /** - * Get data from current payment week (from thu to wed). Also with older days. + * Get data from current payment week (qui-qua). Also with older days. */ - public async getFromWeek(): Promise { + public async getFromWeek(daysBefore = 0): Promise { // Read const today = new Date(); const friday = isFriday(today) ? today : nextFriday(today); + const ordemPgto = ( await this.bigqueryOrdemPagamentoRepository.findMany({ - startDate: subDays(friday, 7), // sex - endDate: subDays(friday, 1), // qui + startDate: subDays(friday, 7 + daysBefore), // sex + endDate: subDays(friday, 1 + daysBefore), // qui }) ).map((i) => ({ ...i } as BigqueryOrdemPagamentoDTO)); return ordemPgto; diff --git a/src/bigquery/services/bigquery-transacao.service.ts b/src/bigquery/services/bigquery-transacao.service.ts index e7d20f77..f55327c7 100644 --- a/src/bigquery/services/bigquery-transacao.service.ts +++ b/src/bigquery/services/bigquery-transacao.service.ts @@ -22,8 +22,8 @@ export class BigqueryTransacaoService { const friday = isFriday(today) ? today : nextFriday(today); const ordemPgto = ( await this.bigqueryTransacaoRepository.findMany({ - startDate: subDays(friday, 7 + daysBack), // sex - endDate: subDays(friday, 1 + daysBack), // qui + startDate: subDays(friday, 8 + daysBack), // sex + endDate: subDays(friday, 2 + daysBack), // qui }) ).map((i) => ({ ...i } as BigqueryTransacao)); return ordemPgto; diff --git a/src/cnab/cnab.controller.ts b/src/cnab/cnab.controller.ts index c8ab18b6..78aab15f 100644 --- a/src/cnab/cnab.controller.ts +++ b/src/cnab/cnab.controller.ts @@ -85,12 +85,14 @@ export class CnabController { @ApiQuery({ name: 'dt_inicio', + description: 'dataOrdem', required: true, type: String, example: '2024-01-01', }) @ApiQuery({ name: 'dt_fim', + description: 'dataOrdem', required: true, type: String, example: '2024-12-25', diff --git a/src/cnab/cnab.service.ts b/src/cnab/cnab.service.ts index c86e0a30..21003a80 100644 --- a/src/cnab/cnab.service.ts +++ b/src/cnab/cnab.service.ts @@ -25,13 +25,11 @@ import { asNumber } from 'src/utils/pipe-utils'; import { Between } from 'typeorm'; import { ClienteFavorecido } from './entity/cliente-favorecido.entity'; import { ItemTransacaoAgrupado } from './entity/pagamento/item-transacao-agrupado.entity'; -import { ItemTransacaoStatus } from './entity/pagamento/item-transacao-status.entity'; import { ItemTransacao } from './entity/pagamento/item-transacao.entity'; import { Pagador } from './entity/pagamento/pagador.entity'; import { TransacaoAgrupado } from './entity/pagamento/transacao-agrupado.entity'; import { TransacaoStatus } from './entity/pagamento/transacao-status.entity'; import { Transacao } from './entity/pagamento/transacao.entity'; -import { ItemTransacaoStatusEnum } from './enums/pagamento/item-transacao-status.enum'; import { PagadorContaEnum } from './enums/pagamento/pagador.enum'; import { TransacaoStatusEnum } from './enums/pagamento/transacao-status.enum'; import { CnabFile104Extrato } from './interfaces/cnab-240/104/extrato/cnab-file-104-extrato.interface'; @@ -86,6 +84,10 @@ export class CnabService { // #region saveTransacoesJae /** + * Gera status = 1 (criado) + * + * Cria ArquivoPublicacao + * * Update Transacoes tables from Jaé (bigquery) * * Requirement: **Salvar novas transações Jaé** - {@link https://github.com/RJ-SMTR/api-cct/issues/207#issuecomment-1984421700 #207, items 3} @@ -93,8 +95,6 @@ export class CnabService { public async saveTransacoesJae() { const METHOD = this.saveTransacoesJae.name; - await this.compareTransacaoViewPublicacao(); - // 1. Update cliente favorecido await this.updateAllFavorecidosFromUsers(); @@ -203,14 +203,17 @@ export class CnabService { }); let itemAg: ItemTransacaoAgrupado | null = null; - // Se existe TransacaoAgrupado + + // Se existir TransacaoAgrupado if (transacaoAg) { - // Create or update item + // Cria ou atualiza item itemAg = await this.itemTransacaoAgService.findOne({ where: { - transacaoAgrupado: { id: transacaoAg.id }, + transacaoAgrupado: { + id: transacaoAg.id, + status: { id: TransacaoStatusEnum.created }, + }, idConsorcio: ordem.idConsorcio, // business rule - status: { id: ItemTransacaoStatusEnum.created }, }, }); if (itemAg) { @@ -225,7 +228,7 @@ export class CnabService { await this.itemTransacaoAgService.save(itemAg); } - // Senão, cria Transacao e Item + // Se não existir, cria Transacao e Item else { transacaoAg = this.getTransacaoAgrupadoDTO(ordem, pagador); transacaoAg = await this.transacaoAgService.save(transacaoAg); @@ -253,17 +256,11 @@ export class CnabService { pagador: Pagador, transacaoAgId: number, ): Promise { - const existing = await this.transacaoService.findOne({ - idOrdemPagamento: ordem.idOrdemPagamento, - transacaoAgrupado: { id: transacaoAgId }, - }); const transacao = new Transacao({ - ...(existing ? { id: existing.id } : {}), dataOrdem: ordem.dataOrdem, dataPagamento: ordem.dataPagamento, pagador: pagador, idOrdemPagamento: ordem.idOrdemPagamento, - status: new TransacaoStatus(TransacaoStatusEnum.created), transacaoAgrupado: { id: transacaoAgId }, }); return await this.transacaoService.save(transacao); @@ -271,7 +268,8 @@ export class CnabService { getTransacaoAgrupadoDTO(ordem: BigqueryOrdemPagamentoDTO, pagador: Pagador) { const dataOrdem = yearMonthDayToDate(ordem.dataOrdem); - const fridayOrdem = nextFriday(nextThursday(startOfDay(dataOrdem))); + /** semana de pagamento: sex-qui */ + const fridayOrdem = nextFriday(startOfDay(dataOrdem)); const transacao = new TransacaoAgrupado({ dataOrdem: fridayOrdem, dataPagamento: ordem.dataPagamento, @@ -300,7 +298,6 @@ export class CnabService { nomeOperadora: ordem.operadora, valor: ordem.valorTotalTransacaoLiquido, transacaoAgrupado: transacaoAg, - status: new ItemTransacaoStatus(ItemTransacaoStatusEnum.created), }); return item; } @@ -311,17 +308,7 @@ export class CnabService { transacao: Transacao, itemTransacaoAg: ItemTransacaoAgrupado, ) { - const existing = await this.itemTransacaoService.findOne({ - where: { - transacao: { id: transacao.id }, - idConsorcio: ordem.idConsorcio, - idOperadora: ordem.idOperadora, - idOrdemPagamento: ordem.idOrdemPagamento, - status: { id: ItemTransacaoStatusEnum.created }, - }, - }); const item = new ItemTransacao({ - ...(existing ? { id: existing.id } : {}), clienteFavorecido: favorecido, dataCaptura: ordem.dataOrdem, dataOrdem: startOfDay(new Date(ordem.dataOrdem)), @@ -332,7 +319,6 @@ export class CnabService { nomeOperadora: ordem.operadora, valor: ordem.valorTotalTransacaoLiquido, transacao: transacao, - status: new ItemTransacaoStatus(ItemTransacaoStatusEnum.created), itemTransacaoAgrupado: { id: itemTransacaoAg.id }, }); await this.itemTransacaoService.save(item); @@ -425,6 +411,8 @@ export class CnabService { } /** + * Muda status de criado para remessa + * * This task will: * 1. Read new Transacoes (with no data in CNAB tables yet, like headerArquivo etc) * 2. Generate CnabFile @@ -435,17 +423,11 @@ export class CnabService { */ public async sendRemessa(tipo: PagadorContaEnum) { const METHOD = this.sendRemessa.name; - let transacoes: Transacao[]; - if (tipo === PagadorContaEnum.CETT) { - transacoes = await this.transacaoService.findAllNewTransacao(tipo); - } else { - const transacoesAg = await this.transacaoAgService.findAllNewTransacao( - tipo, - ); - transacoes = transacoesAg as unknown as Transacao[]; - } + const transacoesAg = await this.transacaoAgService.findAllNewTransacao( + tipo, + ); - if (!transacoes.length) { + if (!transacoesAg.length) { this.logger.log( `Não há transações novas para gerar remessa, nada a fazer...`, METHOD, @@ -454,26 +436,16 @@ export class CnabService { } // Generate Remessas and send SFTP - for (const _transacao of transacoes) { - let transacao: Transacao | undefined; - let transacaoAg: TransacaoAgrupado | undefined; - if (tipo === PagadorContaEnum.ContaBilhetagem) { - transacaoAg = _transacao as unknown as TransacaoAgrupado; - } else { - transacao = _transacao; - } - - // Generate remessa + for (const transacaoAg of transacoesAg) { const nsrSequence = await this.settingsService.getOneBySettingData( cnabSettings.any__cnab_current_nsr_sequence, ); const cnabStr = await this.remessaRetornoService.generateSaveRemessa( - transacao, transacaoAg, ); if (!cnabStr) { this.logger.warn( - `A Transação/Agrupado #${_transacao.id} gerou cnab vazio (sem itens válidos), ignorando...`, + `A TransaçãoAgrupado #${transacaoAg.id} gerou cnab vazio (sem itens válidos), ignorando...`, METHOD, ); await this.settingsService.updateBySettingData( @@ -515,8 +487,9 @@ export class CnabService { // Save Retorno, ArquivoPublicacao, move SFTP to backup try { const retorno104 = parseCnab240Pagamento(cnabString); - /** Busca remessa, salva status = retorno */ + /** Pega o status 2, muda para 3 */ await this.remessaRetornoService.saveRetorno(retorno104); + /** Pega status 3, muda para 4 */ await this.arqPublicacaoService.compareRemessaToRetorno(); const isCnabAccepted = getCnab104Errors(retorno104).length === 0; diff --git a/src/cnab/dto/pagamento/item-transacao.dto.ts b/src/cnab/dto/pagamento/item-transacao.dto.ts index a16b28db..ea458c04 100644 --- a/src/cnab/dto/pagamento/item-transacao.dto.ts +++ b/src/cnab/dto/pagamento/item-transacao.dto.ts @@ -3,7 +3,6 @@ import { DeepPartial } from "typeorm"; import { ClienteFavorecido } from "../../entity/cliente-favorecido.entity"; import { Transacao } from "../../entity/pagamento/transacao.entity"; import { DetalheA } from "../../entity/pagamento/detalhe-a.entity"; -import { ItemTransacaoStatus } from "../../entity/pagamento/item-transacao-status.entity"; function isCreate(object: ItemTransacaoDTO): boolean { return object.id === undefined; @@ -59,15 +58,9 @@ export class ItemTransacaoDTO { @IsNotEmpty() dataOrdem?: Date; - - @ValidateIf(isCreate) - @IsNotEmpty() - status?: DeepPartial; - detalheA?: DeepPartial | null; @ValidateIf(isCreate) @IsNotEmpty() versaoOrdemPagamento?: string; - } \ No newline at end of file diff --git a/src/cnab/dto/pagamento/transacao.dto.ts b/src/cnab/dto/pagamento/transacao.dto.ts index ca3908d1..80f72c61 100644 --- a/src/cnab/dto/pagamento/transacao.dto.ts +++ b/src/cnab/dto/pagamento/transacao.dto.ts @@ -1,9 +1,8 @@ import { IsNotEmpty, ValidateIf } from 'class-validator'; -import { Pagador } from '../../entity/pagamento/pagador.entity'; -import { DeepPartial } from 'typeorm'; -import { TransacaoStatus } from '../../entity/pagamento/transacao-status.entity'; import { Ocorrencia } from 'src/cnab/entity/pagamento/ocorrencia.entity'; import { LancamentoEntity } from 'src/lancamento/lancamento.entity'; +import { DeepPartial } from 'typeorm'; +import { Pagador } from '../../entity/pagamento/pagador.entity'; function isCreate(object: TransacaoDTO): boolean { return object.id === undefined; @@ -28,10 +27,6 @@ export class TransacaoDTO { @IsNotEmpty() pagador?: Pagador; - @ValidateIf(isCreate) - @IsNotEmpty() - status?: DeepPartial; - ocorrencias?: DeepPartial[]; @ValidateIf((obj) => isCreate(obj) && obj.idOrdemPagamento === undefined) diff --git a/src/cnab/entity/arquivo-publicacao.entity.ts b/src/cnab/entity/arquivo-publicacao.entity.ts index a10a40b7..70650537 100644 --- a/src/cnab/entity/arquivo-publicacao.entity.ts +++ b/src/cnab/entity/arquivo-publicacao.entity.ts @@ -1,17 +1,3 @@ -/** - // Remessa - idTransacao: idTransacao, - itemTransacao: { id: idItemTransacao }, - // Retorno - isPago: false, - dataGeracaoRetorno: null, - horaGeracaoRetorno: null, - dataVencimento: friday, - valorLancamento: null, - dataEfetivacao: null, - valorRealEfetivado: null, - */ - import { EntityHelper } from 'src/utils/entity-helper'; import { asNullableStringOrNumber diff --git a/src/cnab/entity/pagamento/detalhe-a.entity.ts b/src/cnab/entity/pagamento/detalhe-a.entity.ts index 38ec6e18..88795517 100644 --- a/src/cnab/entity/pagamento/detalhe-a.entity.ts +++ b/src/cnab/entity/pagamento/detalhe-a.entity.ts @@ -168,7 +168,7 @@ export class DetalheA extends EntityHelper { return [...new Set(detalhesA.map((i) => i.itemTransacaoAgrupado.id))]; } - public static getTransacaoAgIds(detalhesA: DetalheA[]) { + public static getTransacaoAgIds(detalhesA: DetalheA[]): number[] { return [ ...new Set( detalhesA.map((i) => i.itemTransacaoAgrupado.transacaoAgrupado.id), diff --git a/src/cnab/entity/pagamento/item-transacao-agrupado.entity.ts b/src/cnab/entity/pagamento/item-transacao-agrupado.entity.ts index 7f8ae4f5..ea9ef27c 100644 --- a/src/cnab/entity/pagamento/item-transacao-agrupado.entity.ts +++ b/src/cnab/entity/pagamento/item-transacao-agrupado.entity.ts @@ -12,7 +12,6 @@ import { UpdateDateColumn, } from 'typeorm'; import { ClienteFavorecido } from '../cliente-favorecido.entity'; -import { ItemTransacaoStatus } from './item-transacao-status.entity'; import { TransacaoAgrupado } from './transacao-agrupado.entity'; @Entity() @@ -91,12 +90,6 @@ export class ItemTransacaoAgrupado extends EntityHelper { @Column({ type: Date, unique: false, nullable: false }) dataOrdem: Date; - @ManyToOne(() => ItemTransacaoStatus, { eager: false, nullable: false }) - @JoinColumn({ - foreignKeyConstraintName: 'FK_ItemTransacaoAgrupado_status_ManyToOne', - }) - status: ItemTransacaoStatus; - @CreateDateColumn() createdAt: Date; diff --git a/src/cnab/entity/pagamento/item-transacao-status.entity.ts b/src/cnab/entity/pagamento/item-transacao-status.entity.ts deleted file mode 100644 index 3391e6d5..00000000 --- a/src/cnab/entity/pagamento/item-transacao-status.entity.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Column, Entity, PrimaryColumn } from 'typeorm'; -import { ApiProperty } from '@nestjs/swagger'; -import { Allow } from 'class-validator'; -import { EntityHelper } from 'src/utils/entity-helper'; -import { Enum } from 'src/utils/enum'; -import { ItemTransacaoStatusEnum } from '../../enums/pagamento/item-transacao-status.enum'; - -@Entity() -export class ItemTransacaoStatus extends EntityHelper { - constructor(id?: ItemTransacaoStatusEnum, onlyId = true) { - super(); - if (id !== undefined) { - this.id = id; - if (!onlyId) { - this.name = Enum.getKey(ItemTransacaoStatusEnum, id); - } - } - } - - @ApiProperty({ example: 1 }) - @PrimaryColumn({ primaryKeyConstraintName: 'PK_ItemTransacaoStatusId_id' }) - id: number; - - @Allow() - @ApiProperty({ example: 'vanzeiro' }) - @Column() - name?: string; - - getEnum(): ItemTransacaoStatusEnum { - return this.id; - } -} diff --git a/src/cnab/entity/pagamento/item-transacao.entity.ts b/src/cnab/entity/pagamento/item-transacao.entity.ts index c28d47b7..dc24c9de 100644 --- a/src/cnab/entity/pagamento/item-transacao.entity.ts +++ b/src/cnab/entity/pagamento/item-transacao.entity.ts @@ -12,9 +12,8 @@ import { UpdateDateColumn, } from 'typeorm'; import { ClienteFavorecido } from '../cliente-favorecido.entity'; -import { ItemTransacaoStatus } from './item-transacao-status.entity'; -import { Transacao } from './transacao.entity'; import { ItemTransacaoAgrupado } from './item-transacao-agrupado.entity'; +import { Transacao } from './transacao.entity'; @Entity() export class ItemTransacao extends EntityHelper { @@ -106,10 +105,6 @@ export class ItemTransacao extends EntityHelper { @Column({ type: Date, unique: false, nullable: false }) dataOrdem: Date; - @ManyToOne(() => ItemTransacaoStatus, { eager: false, nullable: false }) - @JoinColumn({ foreignKeyConstraintName: 'FK_ItemTransacao_status_ManyToOne' }) - status: ItemTransacaoStatus; - @CreateDateColumn() createdAt: Date; diff --git a/src/cnab/entity/pagamento/transacao.entity.ts b/src/cnab/entity/pagamento/transacao.entity.ts index d343dfc6..7bf2f702 100644 --- a/src/cnab/entity/pagamento/transacao.entity.ts +++ b/src/cnab/entity/pagamento/transacao.entity.ts @@ -14,7 +14,6 @@ import { import { ItemTransacao } from './item-transacao.entity'; import { Pagador } from './pagador.entity'; import { TransacaoAgrupado } from './transacao-agrupado.entity'; -import { TransacaoStatus } from './transacao-status.entity'; @Entity() export class Transacao extends EntityHelper { @@ -52,10 +51,6 @@ export class Transacao extends EntityHelper { }) transacaoAgrupado: TransacaoAgrupado; - @ManyToOne(() => TransacaoStatus, { eager: false, nullable: false }) - @JoinColumn({ foreignKeyConstraintName: 'FK_Transacao_status_ManyToOne' }) - status: TransacaoStatus; - /** Not a physical column */ @OneToMany(() => LancamentoEntity, (lancamento) => lancamento.transacao, { nullable: true, diff --git a/src/cnab/enums/pagamento/item-transacao-status.enum.ts b/src/cnab/enums/pagamento/item-transacao-status.enum.ts deleted file mode 100644 index aec6e072..00000000 --- a/src/cnab/enums/pagamento/item-transacao-status.enum.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum ItemTransacaoStatusEnum { - created = 1, - remessa = 2, - failure = 3, - retorno = 4, -} diff --git a/src/cnab/repository/arquivo-publicacao.repository.ts b/src/cnab/repository/arquivo-publicacao.repository.ts index ba0daec0..373652b3 100644 --- a/src/cnab/repository/arquivo-publicacao.repository.ts +++ b/src/cnab/repository/arquivo-publicacao.repository.ts @@ -62,9 +62,7 @@ export class ArquivoPublicacaoRepository { async findManyByDate(startDate: Date, endDate: Date) { const publicacoes = await this.findMany({ where: { - itemTransacao: { - dataOrdem: Between(startDate, endDate), - }, + dataVencimento: Between(startDate, endDate), }, }); const detalheAList = await this.detalheAService.findMany({ diff --git a/src/cnab/repository/pagamento/transacao.repository.ts b/src/cnab/repository/pagamento/transacao.repository.ts index 57048303..625a4f3d 100644 --- a/src/cnab/repository/pagamento/transacao.repository.ts +++ b/src/cnab/repository/pagamento/transacao.repository.ts @@ -131,7 +131,9 @@ export class TransacaoRepository { ): Promise { return await this.transacaoRepository.find({ where: { - status: { id: TransacaoStatusEnum.created }, + transacaoAgrupado: { + status: { id: TransacaoStatusEnum.created }, + }, pagador: { conta: tipo }, }, }); diff --git a/src/cnab/service/arquivo-publicacao.service.ts b/src/cnab/service/arquivo-publicacao.service.ts index 81d61215..f2b88f89 100644 --- a/src/cnab/service/arquivo-publicacao.service.ts +++ b/src/cnab/service/arquivo-publicacao.service.ts @@ -1,5 +1,12 @@ import { Injectable, Logger } from '@nestjs/common'; -import { isDate, isFriday, nextFriday, startOfDay } from 'date-fns'; +import { + addDays, + isDate, + isFriday, + isThursday, + nextFriday, + startOfDay, +} from 'date-fns'; import { TransacaoViewService } from 'src/transacao-bq/transacao-view.service'; import { asNumber } from 'src/utils/pipe-utils'; import { DeepPartial, FindManyOptions } from 'typeorm'; @@ -8,7 +15,6 @@ import { DetalheA } from '../entity/pagamento/detalhe-a.entity'; import { ItemTransacao } from '../entity/pagamento/item-transacao.entity'; import { Ocorrencia } from '../entity/pagamento/ocorrencia.entity'; import { TransacaoStatus } from '../entity/pagamento/transacao-status.entity'; -import { ItemTransacaoStatusEnum } from '../enums/pagamento/item-transacao-status.enum'; import { TransacaoStatusEnum } from '../enums/pagamento/transacao-status.enum'; import { ArquivoPublicacaoRepository } from '../repository/arquivo-publicacao.repository'; import { OcorrenciaService } from './ocorrencia.service'; @@ -67,7 +73,10 @@ export class ArquivoPublicacaoService { if (!isDate(ordem) || !ordem) { console.warn('erro'); } - const friday = isFriday(ordem) ? ordem : nextFriday(ordem); + + /** Como é data relativa, se for quinta, pega a sexta da próxima semana */ + const friday = isThursday(ordem) ? addDays(ordem, 8) : nextFriday(ordem); + const arquivo = new ArquivoPublicacao({ ...(existing ? { id: existing.id } : {}), // Remessa @@ -109,6 +118,7 @@ export class ArquivoPublicacaoService { METHOD, ); } + let transacaoAgrupado = -1; // Header Arquivo Remessa for (const headerArquivo of headerArquivos) { @@ -133,6 +143,11 @@ export class ArquivoPublicacaoService { // Save retorno and update Transacao, Publicacao await this.salvaOcorrenciasDetalheA(detalheA); await this.savePublicacaoRetorno(detalheA); + + if (transacaoAgrupado === -1) { + transacaoAgrupado = + detalheA?.itemTransacaoAgrupado?.transacaoAgrupado?.id; + } } } @@ -141,6 +156,15 @@ export class ArquivoPublicacaoService { id: headerArquivo.id, }); } + + // Update TransacaoAgrupado + const today = new Date(); + const friday = isFriday(today) ? today : nextFriday(today); + await this.transacaoAgService.save({ + id: transacaoAgrupado, + status: new TransacaoStatus(TransacaoStatusEnum.publicado), + dataPagamento: startOfDay(friday), + }); } async salvaOcorrenciasDetalheA(detalheARetorno: DetalheA) { @@ -188,28 +212,6 @@ export class ArquivoPublicacaoService { detalheARetorno.headerLote.headerArquivo.horaGeracao; await this.arquivoPublicacaoRepository.save(publicacao); - - // Update ItemTransacaoStatus - await this.itemTransacaoService.save({ - id: publicacao.itemTransacao.id, - status: { id: ItemTransacaoStatusEnum.retorno }, - }); - - // Update Transacao status - await this.transacaoService.save({ - id: publicacao.idTransacao, - status: new TransacaoStatus(TransacaoStatusEnum.publicado), - }); - } - - // Update TransacaoAgrupado - const transacaoAg = - detalheARetorno.headerLote.headerArquivo.transacaoAgrupado; - if (transacaoAg) { - await this.transacaoAgService.save({ - id: transacaoAg.id, - status: new TransacaoStatus(TransacaoStatusEnum.publicado), - }); } } } diff --git a/src/cnab/service/pagamento/detalhe-a.service.ts b/src/cnab/service/pagamento/detalhe-a.service.ts index 2bc25a3e..f0b76d85 100644 --- a/src/cnab/service/pagamento/detalhe-a.service.ts +++ b/src/cnab/service/pagamento/detalhe-a.service.ts @@ -13,7 +13,6 @@ import { TransacaoStatusEnum } from 'src/cnab/enums/pagamento/transacao-status.e import { CnabHeaderArquivo104 } from 'src/cnab/interfaces/cnab-240/104/cnab-header-arquivo-104.interface'; import { CnabHeaderLote104Pgto } from 'src/cnab/interfaces/cnab-240/104/pagamento/cnab-header-lote-104-pgto.interface'; import { TransacaoAgrupadoService } from './transacao-agrupado.service'; -import { ItemTransacaoStatusEnum } from 'src/cnab/enums/pagamento/item-transacao-status.enum'; import { ItemTransacaoAgrupadoService } from './item-transacao-agrupado.service'; import { CnabLote104Pgto } from 'src/cnab/interfaces/cnab-240/104/pagamento/cnab-lote-104-pgto.interface'; @@ -54,12 +53,6 @@ export class DetalheAService { status: { id: TransacaoStatusEnum.retorno }, }, ); - await this.itemTransacaoAgrupadoService.updateMany( - DetalheA.getItemTransacaoAgIds(detalhesA), - { - status: { id: ItemTransacaoStatusEnum.retorno }, - }, - ); } /** diff --git a/src/cnab/service/pagamento/header-arquivo.service.ts b/src/cnab/service/pagamento/header-arquivo.service.ts index 94c80e9c..3a4a860a 100644 --- a/src/cnab/service/pagamento/header-arquivo.service.ts +++ b/src/cnab/service/pagamento/header-arquivo.service.ts @@ -13,7 +13,6 @@ import { SaveIfNotExists } from 'src/utils/types/save-if-not-exists.type'; import { DeepPartial, FindOptionsWhere } from 'typeorm'; import { HeaderArquivoDTO } from '../../dto/pagamento/header-arquivo.dto'; import { HeaderArquivo } from '../../entity/pagamento/header-arquivo.entity'; -import { Transacao } from '../../entity/pagamento/transacao.entity'; import { HeaderArquivoTipoArquivo } from '../../enums/pagamento/header-arquivo-tipo-arquivo.enum'; import { HeaderArquivoRepository } from '../../repository/pagamento/header-arquivo.repository'; import { PagadorService } from './pagador.service'; @@ -37,12 +36,11 @@ export class HeaderArquivoService { */ public async getDTO( tipo_arquivo: HeaderArquivoTipoArquivo, - transacao?: Transacao, - transacaoAg?: TransacaoAgrupado, + transacaoAg: TransacaoAgrupado, ): Promise { const now = getBRTFromUTC(new Date()); const pagador = await this.pagadorService.getOneByIdPagador( - transacao?.pagador.id || (transacaoAg?.pagador.id as number), + transacaoAg?.pagador.id, ); const dto = new HeaderArquivoDTO({ agencia: pagador.agencia, @@ -56,7 +54,6 @@ export class HeaderArquivoService { horaGeracao: now, dvAgencia: pagador.dvAgencia, dvConta: pagador.dvConta, - transacao: transacao, transacaoAgrupado: transacaoAg, nomeEmpresa: pagador.nomeEmpresa, numeroConta: pagador.conta, diff --git a/src/cnab/service/pagamento/item-transacao.service.ts b/src/cnab/service/pagamento/item-transacao.service.ts index 3da43198..715d25ae 100644 --- a/src/cnab/service/pagamento/item-transacao.service.ts +++ b/src/cnab/service/pagamento/item-transacao.service.ts @@ -1,11 +1,8 @@ import { Injectable, Logger } from '@nestjs/common'; import { ItemTransacaoDTO } from 'src/cnab/dto/pagamento/item-transacao.dto'; import { ClienteFavorecido } from 'src/cnab/entity/cliente-favorecido.entity'; -import { ItemTransacaoStatus } from 'src/cnab/entity/pagamento/item-transacao-status.entity'; import { ItemTransacao } from 'src/cnab/entity/pagamento/item-transacao.entity'; import { Transacao } from 'src/cnab/entity/pagamento/transacao.entity'; -import { ItemTransacaoStatusEnum } from 'src/cnab/enums/pagamento/item-transacao-status.enum'; -import { TransacaoStatusEnum } from 'src/cnab/enums/pagamento/transacao-status.enum'; import { ItemTransacaoRepository } from 'src/cnab/repository/pagamento/item-transacao.repository'; import { LancamentoEntity } from 'src/lancamento/lancamento.entity'; import { CustomLogger } from 'src/utils/custom-logger'; @@ -71,7 +68,6 @@ export class ItemTransacaoService { transacao: { id: transacao.id }, valor: lancamento.valor_a_pagar, dataOrdem: lancamento.data_ordem, - status: new ItemTransacaoStatus(ItemTransacaoStatusEnum.created), }); return itemTransacao; } @@ -232,11 +228,9 @@ export class ItemTransacaoService { const METHOD = 'moveAllFailedToTransacao()'; const allFailed = await this.itemTransacaoRepository.findMany({ where: { - status: { id: ItemTransacaoStatusEnum.failure }, transacao: { id: Not(transacaoDest.id), pagador: { id: transacaoDest.pagador.id }, - status: { id: TransacaoStatusEnum.remessa }, }, }, }); @@ -247,7 +241,6 @@ export class ItemTransacaoService { await this.itemTransacaoRepository.saveDTO({ id: item.id, transacao: { id: transacaoDest.id }, - status: new ItemTransacaoStatus(ItemTransacaoStatusEnum.created), }); } diff --git a/src/cnab/service/pagamento/remessa-retorno.service.ts b/src/cnab/service/pagamento/remessa-retorno.service.ts index 9ee639a4..461fdb5b 100644 --- a/src/cnab/service/pagamento/remessa-retorno.service.ts +++ b/src/cnab/service/pagamento/remessa-retorno.service.ts @@ -1,5 +1,5 @@ import { Injectable, Logger } from '@nestjs/common'; -import { isSameDay, nextFriday, nextThursday, startOfDay } from 'date-fns'; +import { isSameDay, startOfDay } from 'date-fns'; import { DetalheADTO } from 'src/cnab/dto/pagamento/detalhe-a.dto'; import { HeaderLoteDTO } from 'src/cnab/dto/pagamento/header-lote.dto'; import { ClienteFavorecido } from 'src/cnab/entity/cliente-favorecido.entity'; @@ -16,15 +16,11 @@ import { cnabSettings } from 'src/settings/cnab.settings'; import { SettingsService } from 'src/settings/settings.service'; import { CustomLogger } from 'src/utils/custom-logger'; import { asString } from 'src/utils/pipe-utils'; -import { DeepPartial, In } from 'typeorm'; +import { DeepPartial } from 'typeorm'; import { DetalheBDTO } from '../../dto/pagamento/detalhe-b.dto'; import { HeaderArquivoDTO } from '../../dto/pagamento/header-arquivo.dto'; import { HeaderArquivo } from '../../entity/pagamento/header-arquivo.entity'; -import { ItemTransacaoStatus } from '../../entity/pagamento/item-transacao-status.entity'; -import { ItemTransacao } from '../../entity/pagamento/item-transacao.entity'; -import { Transacao } from '../../entity/pagamento/transacao.entity'; import { HeaderArquivoTipoArquivo } from '../../enums/pagamento/header-arquivo-tipo-arquivo.enum'; -import { ItemTransacaoStatusEnum } from '../../enums/pagamento/item-transacao-status.enum'; import { CnabHeaderArquivo104 } from '../../interfaces/cnab-240/104/cnab-header-arquivo-104.interface'; import { CnabDetalheA_104 } from '../../interfaces/cnab-240/104/pagamento/cnab-detalhe-a-104.interface'; import { CnabDetalheB_104 } from '../../interfaces/cnab-240/104/pagamento/cnab-detalhe-b-104.interface'; @@ -72,20 +68,18 @@ export class RemessaRetornoService { * - Cnab Tables DTO to be saved in database */ public async generateSaveRemessa( - transacao?: Transacao, - transacaoAg?: TransacaoAgrupado, + transacaoAg: TransacaoAgrupado, ): Promise { // Get headerArquivo const headerArquivoDTO = await this.headerArquivoService.getDTO( HeaderArquivoTipoArquivo.Remessa, - transacao, transacaoAg, ); // saveHeaderArquivo await this.saveHeaderArquivo(headerArquivoDTO); - const pagador = transacao?.pagador || (transacaoAg?.pagador as Pagador); + const pagador = transacaoAg.pagador; const headerLoteDTO = this.headerLoteService.getDTO( headerArquivoDTO, pagador, @@ -93,7 +87,6 @@ export class RemessaRetornoService { const savedHeaderLote = await this.saveHeaderLoteDTO(headerLoteDTO); const detalhes = await this.saveListDetalhes( savedHeaderLote.id, - transacao, transacaoAg, ); @@ -124,17 +117,10 @@ export class RemessaRetornoService { headerLoteDTO, processedCnab104.lotes[0].headerLote, ); - if (transacaoAg) { - await this.transacaoAgService.save({ - id: transacaoAg.id, - status: new TransacaoStatus(TransacaoStatusEnum.remessa), - }); - } else if (transacao) { - await this.transacaoService.save({ - id: transacao.id, - status: new TransacaoStatus(TransacaoStatusEnum.remessa), - }); - } + await this.transacaoAgService.save({ + id: transacaoAg.id, + status: new TransacaoStatus(TransacaoStatusEnum.remessa), + }); return cnabString; } @@ -142,20 +128,15 @@ export class RemessaRetornoService { async convertCnabDetalheAToDTO( detalheA: CnabDetalheA_104, headerLoteId: number, - itemTransacao?: ItemTransacao, - itemTransacaoAg?: ItemTransacaoAgrupado, + itemTransacaoAg: ItemTransacaoAgrupado, ) { const existing = await this.detalheAService.findOne({ where: { nsr: Number(detalheA.nsr.value), - ...(itemTransacao ? { itemTransacao: { id: itemTransacao?.id } } : {}), - ...(itemTransacaoAg - ? { itemTransacaoAgrupado: { id: itemTransacaoAg?.id } } - : {}), + itemTransacaoAgrupado: { id: itemTransacaoAg?.id }, }, }); - const favorecidoId = (itemTransacao || itemTransacaoAg)?.clienteFavorecido - .id as number; + const favorecidoId = itemTransacaoAg.clienteFavorecido.id as number; return new DetalheADTO({ ...(existing ? { id: existing.id } : {}), nsr: Number(detalheA.nsr.value), @@ -238,59 +219,31 @@ export class RemessaRetornoService { */ async saveListDetalhes( headerLoteId: number, - transacao?: Transacao, - transacaoAg?: TransacaoAgrupado, + transacaoAg: TransacaoAgrupado, ): Promise { let numeroDocumento = await this.detalheAService.getNextNumeroDocumento( new Date(), ); // Obter item transacao de transacoes - const itemTransacaoMany = transacao - ? await this.itemTransacaoService.findManyByIdTransacao(transacao.id) - : await this.itemTransacaoAgService.findManyByIdTransacao( - (transacaoAg as TransacaoAgrupado).id, - ); - const isTransacaoAgrupado = Boolean(transacaoAg); + const itemTransacaoMany = + await this.itemTransacaoAgService.findManyByIdTransacao( + (transacaoAg as TransacaoAgrupado).id, + ); // Para cada itemTransacao, cria detalhe const detalhes: CnabRegistros104Pgto[] = []; - let itemTransacaoAux: ItemTransacao | undefined; let itemTransacaoAgAux: ItemTransacaoAgrupado | undefined; for (const itemTransacao of itemTransacaoMany) { // add valid itemTransacao - if (isTransacaoAgrupado) { - itemTransacaoAgAux = itemTransacao as ItemTransacaoAgrupado; - } else { - itemTransacaoAux = itemTransacao as ItemTransacao; - } + itemTransacaoAgAux = itemTransacao as ItemTransacaoAgrupado; const detalhe = await this.saveDetalhes104( numeroDocumento, headerLoteId, - itemTransacaoAux, itemTransacaoAgAux, ); if (detalhe) { detalhes.push(detalhe); - - // Update status - if (itemTransacaoAux) { - await this.itemTransacaoService.save({ - id: itemTransacaoAux.id, - status: new ItemTransacaoStatus(ItemTransacaoStatusEnum.remessa), - }); - } - if (itemTransacaoAgAux) { - await this.itemTransacaoAgService.save({ - id: itemTransacaoAgAux.id, - status: new ItemTransacaoStatus(ItemTransacaoStatusEnum.remessa), - }); - await this.updateTransacoesStatus( - itemTransacaoAgAux.transacaoAgrupado.transacoes, - TransacaoStatusEnum.remessa, - ItemTransacaoStatusEnum.remessa, - ); - } } numeroDocumento++; } @@ -451,26 +404,16 @@ export class RemessaRetornoService { public async saveDetalhes104( numeroDocumento: number, headerLoteId: number, - itemTransacao?: ItemTransacao, - itemTransacaoAg?: ItemTransacaoAgrupado, + itemTransacaoAg: ItemTransacaoAgrupado, ): Promise { const METHOD = 'getDetalhes104()'; - const favorecido = (itemTransacao || (itemTransacaoAg as any)) - .clienteFavorecido as ClienteFavorecido; + const favorecido = itemTransacaoAg.clienteFavorecido as ClienteFavorecido; // Failure if no favorecido if (!favorecido) { - if (itemTransacao) { - await this.itemTransacaoService.save({ - id: itemTransacao.id, - status: new ItemTransacaoStatus(ItemTransacaoStatusEnum.failure), - }); - } else if (itemTransacaoAg) { - await this.itemTransacaoService.save({ - id: itemTransacaoAg.id, - status: new ItemTransacaoStatus(ItemTransacaoStatusEnum.failure), - }); - } + await this.itemTransacaoService.save({ + id: itemTransacaoAg.id, + }); this.logger.debug( `Falha ao usar ItemTransacao: favorecido ausente.`, @@ -481,11 +424,8 @@ export class RemessaRetornoService { // Save detalheA let nsr = await this.getNextNSR(); - const itemTransacaoAux = (itemTransacao || - itemTransacaoAg) as ItemTransacao; - const fridayOrdem = itemTransacao - ? nextFriday(nextThursday(startOfDay(itemTransacaoAux.dataOrdem))) - : itemTransacaoAux.dataOrdem; + const itemTransacaoAgAux = itemTransacaoAg; + const fridayOrdem = itemTransacaoAgAux.dataOrdem; const detalheA: CnabDetalheA_104 = sc(PgtoRegistros.detalheA); detalheA.codigoBancoDestino.value = favorecido.codigoBanco; detalheA.codigoAgenciaDestino.value = favorecido.agencia; @@ -496,13 +436,12 @@ export class RemessaRetornoService { detalheA.numeroDocumentoEmpresa.value = numeroDocumento; detalheA.dataVencimento.value = fridayOrdem; // indicadorFormaParcelamento = DataFixa - detalheA.valorLancamento.value = itemTransacaoAux.valor; + detalheA.valorLancamento.value = itemTransacaoAgAux.valor; detalheA.nsr.value = String(nsr); const savedDetalheA = await this.saveDetalheA( detalheA, headerLoteId, - itemTransacao, itemTransacaoAg, ); @@ -533,45 +472,14 @@ export class RemessaRetornoService { }; } - async updateTransacoesStatus( - transacoes: Transacao[], - transacaoStatus: TransacaoStatusEnum, - itemTransacaoStatus: ItemTransacaoStatusEnum, - ) { - const allItemTransacoes = await this.itemTransacaoService.findMany({ - where: { - transacao: { id: In(transacoes.map((i) => i.id)) }, - }, - }); - for (const transacao of transacoes) { - const itemTransacoes = allItemTransacoes.filter( - (i) => i.transacao.id === transacao.id, - ); - for (const item of itemTransacoes) { - // Update ItemTransacaoStatus - await this.itemTransacaoService.save({ - id: item.id, - status: { id: itemTransacaoStatus }, - }); - } - // Update Transacao status - await this.transacaoService.save({ - id: transacao.id, - status: { id: transacaoStatus }, - }); - } - } - async saveDetalheA( detalheA104: CnabDetalheA_104, savedHeaderLoteId: number, - itemTransacao?: ItemTransacao, - itemTransacaoAg?: ItemTransacaoAgrupado, + itemTransacaoAg: ItemTransacaoAgrupado, ) { const detalheADTO = await this.convertCnabDetalheAToDTO( detalheA104, savedHeaderLoteId, - itemTransacao, itemTransacaoAg, ); const saved = await this.detalheAService.save(detalheADTO); @@ -620,5 +528,4 @@ export class RemessaRetornoService { // headerArquivoRetUpdated; } - } diff --git a/src/cnab/service/pagamento/transacao-agrupado.service.ts b/src/cnab/service/pagamento/transacao-agrupado.service.ts index e42f235d..254809f7 100644 --- a/src/cnab/service/pagamento/transacao-agrupado.service.ts +++ b/src/cnab/service/pagamento/transacao-agrupado.service.ts @@ -4,14 +4,12 @@ import { Transacao } from '../../entity/pagamento/transacao.entity'; import { isFriday, nextFriday } from 'date-fns'; import { Pagador } from 'src/cnab/entity/pagamento/pagador.entity'; import { TransacaoAgrupado } from 'src/cnab/entity/pagamento/transacao-agrupado.entity'; -import { TransacaoStatus } from 'src/cnab/entity/pagamento/transacao-status.entity'; -import { TransacaoStatusEnum } from 'src/cnab/enums/pagamento/transacao-status.enum'; +import { PagadorContaEnum } from 'src/cnab/enums/pagamento/pagador.enum'; import { TransacaoAgrupadoRepository } from 'src/cnab/repository/pagamento/transacao-agrupado.repository'; import { LancamentoEntity } from 'src/lancamento/lancamento.entity'; import { asNumber } from 'src/utils/pipe-utils'; import { EntityCondition } from 'src/utils/types/entity-condition.type'; import { DeepPartial, UpdateResult } from 'typeorm'; -import { PagadorContaEnum } from 'src/cnab/enums/pagamento/pagador.enum'; @Injectable() export class TransacaoAgrupadoService { @@ -49,7 +47,6 @@ export class TransacaoAgrupadoService { dataPagamento: null, lancamentos: newLancamentos, // unique id for Lancamentos pagador: { id: pagador.id } as Pagador, - status: new TransacaoStatus(TransacaoStatusEnum.created), }); return transacao; } @@ -63,7 +60,7 @@ export class TransacaoAgrupadoService { */ public updateMany( ids: number[], - set: DeepPartial, + set: DeepPartial, ): Promise { return this.transacaoAgRepository.updateMany(ids, set); } diff --git a/src/cnab/service/pagamento/transacao.service.ts b/src/cnab/service/pagamento/transacao.service.ts index a36c6456..76209c39 100644 --- a/src/cnab/service/pagamento/transacao.service.ts +++ b/src/cnab/service/pagamento/transacao.service.ts @@ -5,15 +5,13 @@ import { TransacaoRepository } from '../../repository/pagamento/transacao.reposi import { isFriday, nextFriday } from 'date-fns'; import { Pagador } from 'src/cnab/entity/pagamento/pagador.entity'; -import { TransacaoStatus } from 'src/cnab/entity/pagamento/transacao-status.entity'; -import { TransacaoStatusEnum } from 'src/cnab/enums/pagamento/transacao-status.enum'; +import { PagadorContaEnum } from 'src/cnab/enums/pagamento/pagador.enum'; import { LancamentoEntity } from 'src/lancamento/lancamento.entity'; import { asNumber, asString } from 'src/utils/pipe-utils'; +import { EntityCondition } from 'src/utils/types/entity-condition.type'; import { SaveIfNotExists } from 'src/utils/types/save-if-not-exists.type'; import { validateDTO } from 'src/utils/validation-utils'; import { DeepPartial, FindManyOptions, UpdateResult } from 'typeorm'; -import { EntityCondition } from 'src/utils/types/entity-condition.type'; -import { PagadorContaEnum } from 'src/cnab/enums/pagamento/pagador.enum'; @Injectable() export class TransacaoService { @@ -49,7 +47,6 @@ export class TransacaoService { dataPagamento: null, lancamentos: newLancamentos, // unique id for Lancamentos pagador: { id: pagador.id } as Pagador, - status: new TransacaoStatus(TransacaoStatusEnum.created), }); return transacao; } diff --git a/src/cron-jobs/cron-jobs.service.ts b/src/cron-jobs/cron-jobs.service.ts index 999bdcf2..36d9bca3 100644 --- a/src/cron-jobs/cron-jobs.service.ts +++ b/src/cron-jobs/cron-jobs.service.ts @@ -96,8 +96,10 @@ export class CronJobsService implements OnModuleInit, OnModuleLoad { async onModuleLoad() { const THIS_CLASS_WITH_METHOD = 'CronJobsService.onModuleLoad'; - await this.sendRemessa() - + await this.saveTransacoesJae1(); + await this.sendRemessa(); + // await this.updateRetorno(); + this.jobsConfig.push( { name: CrobJobsEnum.bulkSendInvites, @@ -709,21 +711,23 @@ export class CronJobsService implements OnModuleInit, OnModuleLoad { } } - async getIsCnabJobEnabled() { + async getIsCnabJobEnabled(method?: string) { const cnabJobEnabled = await this.settingsService.getOneBySettingData( cnabSettings.any__cnab_jobs_enabled, ); + if (method !== undefined && !cnabJobEnabled.getValueAsBoolean()) { + this.logger.log( + `Tarefa ignorada pois está desabilitada em ${cnabSettings.any__cnab_jobs_enabled.name}`, + method, + ); + } return cnabJobEnabled.getValueAsBoolean(); } async saveTransacoesJae1() { const METHOD = this.saveTransacoesJae1.name; - - if (!this.getIsCnabJobEnabled()) { - this.logger.log( - `Tarefa ignorada pois está desabilitada em ${cnabSettings.any__cnab_jobs_enabled.name}`, - METHOD, - ); + + if (!(await this.getIsCnabJobEnabled(METHOD))) { return; } @@ -740,12 +744,8 @@ export class CronJobsService implements OnModuleInit, OnModuleLoad { async saveTransacoesJae2() { const METHOD = this.saveTransacoesJae2.name; - - if (!this.getIsCnabJobEnabled()) { - this.logger.log( - `Tarefa ignorada pois está desabilitada em ${cnabSettings.any__cnab_jobs_enabled.name}`, - METHOD, - ); + + if (!(await this.getIsCnabJobEnabled(METHOD))) { return; } @@ -766,12 +766,8 @@ export class CronJobsService implements OnModuleInit, OnModuleLoad { async sendRemessa() { const METHOD = this.sendRemessa.name; - - if (!await this.getIsCnabJobEnabled()) { - this.logger.log( - `Tarefa ignorada pois está desabilitada em ${cnabSettings.any__cnab_jobs_enabled.name}`, - METHOD, - ); + + if (!(await this.getIsCnabJobEnabled(METHOD))) { return; } @@ -787,12 +783,8 @@ export class CronJobsService implements OnModuleInit, OnModuleLoad { async updateRetorno() { const METHOD = this.updateRetorno.name; - - if (!this.getIsCnabJobEnabled()) { - this.logger.log( - `Tarefa ignorada pois está desabilitada em ${cnabSettings.any__cnab_jobs_enabled.name}`, - METHOD, - ); + + if (!(await this.getIsCnabJobEnabled(METHOD))) { return; } @@ -806,12 +798,8 @@ export class CronJobsService implements OnModuleInit, OnModuleLoad { async saveExtrato() { const METHOD = this.saveExtrato.name; - - if (!this.getIsCnabJobEnabled()) { - this.logger.log( - `Tarefa ignorada pois está desabilitada em ${cnabSettings.any__cnab_jobs_enabled.name}`, - METHOD, - ); + + if (!(await this.getIsCnabJobEnabled(METHOD))) { return; } diff --git a/src/database/migrations/1717014260013-RemoveCnabStatus.ts b/src/database/migrations/1717014260013-RemoveCnabStatus.ts new file mode 100644 index 00000000..10dccfa6 --- /dev/null +++ b/src/database/migrations/1717014260013-RemoveCnabStatus.ts @@ -0,0 +1,37 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RemoveCnabStatus1717014260013 implements MigrationInterface { + name = 'RemoveCnabStatus1717014260013' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "item_transacao_agrupado" DROP CONSTRAINT "FK_ItemTransacaoAgrupado_status_ManyToOne"`); + await queryRunner.query(`ALTER TABLE "item_transacao" DROP CONSTRAINT "FK_ItemTransacao_status_ManyToOne"`); + await queryRunner.query(`ALTER TABLE "transacao" DROP CONSTRAINT "FK_Transacao_status_ManyToOne"`); + await queryRunner.query(`ALTER TABLE "item_transacao_agrupado" DROP COLUMN "statusId"`); + await queryRunner.query(`ALTER TABLE "item_transacao" DROP COLUMN "statusId"`); + await queryRunner.query(`ALTER TABLE "transacao" DROP COLUMN "statusId"`); + await queryRunner.query(`ALTER TABLE "lancamento" DROP COLUMN "glosa"`); + await queryRunner.query(`ALTER TABLE "lancamento" ADD "glosa" numeric NOT NULL`); + await queryRunner.query(`ALTER TABLE "lancamento" DROP COLUMN "recurso"`); + await queryRunner.query(`ALTER TABLE "lancamento" ADD "recurso" numeric NOT NULL`); + await queryRunner.query(`ALTER TABLE "lancamento" DROP COLUMN "anexo"`); + await queryRunner.query(`ALTER TABLE "lancamento" ADD "anexo" numeric NOT NULL`); + await queryRunner.query(`DROP TABLE "item_transacao_status"`); // No down command + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "lancamento" DROP COLUMN "anexo"`); + await queryRunner.query(`ALTER TABLE "lancamento" ADD "anexo" character varying NOT NULL`); + await queryRunner.query(`ALTER TABLE "lancamento" DROP COLUMN "recurso"`); + await queryRunner.query(`ALTER TABLE "lancamento" ADD "recurso" character varying NOT NULL`); + await queryRunner.query(`ALTER TABLE "lancamento" DROP COLUMN "glosa"`); + await queryRunner.query(`ALTER TABLE "lancamento" ADD "glosa" character varying NOT NULL`); + await queryRunner.query(`ALTER TABLE "transacao" ADD "statusId" integer NOT NULL`); + await queryRunner.query(`ALTER TABLE "item_transacao" ADD "statusId" integer NOT NULL`); + await queryRunner.query(`ALTER TABLE "item_transacao_agrupado" ADD "statusId" integer NOT NULL`); + await queryRunner.query(`ALTER TABLE "transacao" ADD CONSTRAINT "FK_Transacao_status_ManyToOne" FOREIGN KEY ("statusId") REFERENCES "transacao_status"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "item_transacao" ADD CONSTRAINT "FK_ItemTransacao_status_ManyToOne" FOREIGN KEY ("statusId") REFERENCES "item_transacao_status"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "item_transacao_agrupado" ADD CONSTRAINT "FK_ItemTransacaoAgrupado_status_ManyToOne" FOREIGN KEY ("statusId") REFERENCES "item_transacao_status"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + +} diff --git a/src/database/seeds/item-transacao-status/item-transacao-status-seed.module.ts b/src/database/seeds/item-transacao-status/item-transacao-status-seed.module.ts deleted file mode 100644 index 917265e3..00000000 --- a/src/database/seeds/item-transacao-status/item-transacao-status-seed.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { ItemTransacaoStatus } from 'src/cnab/entity/pagamento/item-transacao-status.entity'; -import { ItemTransacaoStatusSeedService } from './item-transacao-status-seed.service'; - -@Module({ - imports: [TypeOrmModule.forFeature([ItemTransacaoStatus])], - providers: [ItemTransacaoStatusSeedService], - exports: [ItemTransacaoStatusSeedService], -}) -export class ItemTransacaoStatusSeedModule { } diff --git a/src/database/seeds/item-transacao-status/item-transacao-status-seed.service.ts b/src/database/seeds/item-transacao-status/item-transacao-status-seed.service.ts deleted file mode 100644 index 4dc2895f..00000000 --- a/src/database/seeds/item-transacao-status/item-transacao-status-seed.service.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { ItemTransacaoStatus } from 'src/cnab/entity/pagamento/item-transacao-status.entity'; -import { ItemTransacaoStatusEnum } from 'src/cnab/enums/pagamento/item-transacao-status.enum'; -import { Enum } from 'src/utils/enum'; -import { Repository } from 'typeorm'; - -@Injectable() -export class ItemTransacaoStatusSeedService { - constructor( - @InjectRepository(ItemTransacaoStatus) - private itemTrStatusRepository: Repository, - ) { } - - async validateRun() { - return Promise.resolve(true); - } - - async run() { - const enumItems = Enum.getItems(ItemTransacaoStatusEnum); - const newItems = enumItems.map(item => - this.itemTrStatusRepository.create({ - id: item.value, - name: item.key, - })); - await this.itemTrStatusRepository.upsert(newItems, { conflictPaths: { id: true } }); - } -} diff --git a/src/database/seeds/lancamento/lancamento-seed-data.service.ts b/src/database/seeds/lancamento/lancamento-seed-data.service.ts index 94d49bec..d2f7b2b0 100644 --- a/src/database/seeds/lancamento/lancamento-seed-data.service.ts +++ b/src/database/seeds/lancamento/lancamento-seed-data.service.ts @@ -57,14 +57,14 @@ export class LancamentoSeedDataService { data_lancamento: today, data_ordem: today, data_pgto: today, - glosa: '1', + glosa: 1, numero_processo: '1', - recurso: '1', + recurso: 1, valor: 110, valor_a_pagar: 110, userId: users[0].id, user: { id: users[0].id }, - anexo: '1', + anexo: 1, }, { algoritmo: '2', @@ -73,15 +73,15 @@ export class LancamentoSeedDataService { data_lancamento: today, data_ordem: today, data_pgto: today, - glosa: '2', + glosa: 2, numero_processo: '2', - recurso: '2', + recurso: 2, valor: 951, valor_a_pagar: 951, userId: users[0].id, user: { id: users[0].id }, auth_usersIds: userIds.slice(0, 1).join(','), - anexo: '1', + anexo: 1, }, { algoritmo: 2, @@ -90,15 +90,15 @@ export class LancamentoSeedDataService { data_lancamento: today, data_ordem: today, data_pgto: today, - glosa: '2', + glosa: 2, numero_processo: '2', - recurso: '2', + recurso: 2, valor: 951.12, valor_a_pagar: 951.12, userId: users[0].id, user: { id: users[0].id }, auth_usersIds: userIds.slice(0, 2).join(','), - anexo: '1', + anexo: 1, }, ] as LancamentoSeedData[]) : []), diff --git a/src/database/seeds/run-seed.ts b/src/database/seeds/run-seed.ts index a246363d..a8f1350c 100644 --- a/src/database/seeds/run-seed.ts +++ b/src/database/seeds/run-seed.ts @@ -12,7 +12,6 @@ import { SettingSeedService } from './setting/setting-seed.service'; import { StatusSeedService } from './status/status-seed.service'; import { UserSeedService } from './user/user-seed.service'; import { TransacaoStatusSeedService } from './transacao-status/transacao-status-seed.service'; -import { ItemTransacaoStatusSeedService } from './item-transacao-status/item-transacao-status-seed.service'; import { HeaderArquivoStatusSeedService } from './header-arquivo-status/header-arquivo-status-seed.service'; import { ClienteFavorecidoSeedService } from './cliente-favorecido/cliente-favorecido-seed.service'; import { LancamentoSeedService } from './lancamento/lancamento-seed.service'; @@ -32,7 +31,6 @@ const runSeed = async () => { let services = [ RoleSeedService, TransacaoStatusSeedService, - ItemTransacaoStatusSeedService, HeaderArquivoStatusSeedService, StatusSeedService, InfoSeedService, diff --git a/src/database/seeds/seed.module.ts b/src/database/seeds/seed.module.ts index e1ba5058..5e9af9eb 100644 --- a/src/database/seeds/seed.module.ts +++ b/src/database/seeds/seed.module.ts @@ -20,7 +20,6 @@ import { BigqueryModule } from 'src/bigquery/bigquery.module'; import googleConfig from 'src/config/google.config'; import { PagadorSeedModule } from './pagador/pagador-seed.module'; import { TransacaoStatusSeedModule } from './transacao-status/transacao-status-seed.module'; -import { ItemTransacaoStatusSeedModule } from './item-transacao-status/item-transacao-status-seed.module'; import { HeaderArquivoStatusSeedModule } from './header-arquivo-status/header-arquivo-status-seed.module'; import { ClienteFavorecidoSeedModule } from './cliente-favorecido/cliente-favorecido-seed.module'; import { LancamentoSeedModule } from './lancamento/lancamento-seed.module'; @@ -29,7 +28,6 @@ import { LancamentoSeedModule } from './lancamento/lancamento-seed.module'; imports: [ RoleSeedModule, TransacaoStatusSeedModule, - ItemTransacaoStatusSeedModule, HeaderArquivoStatusSeedModule, StatusSeedModule, InfoSeedModule, diff --git a/src/lancamento/dtos/lancamentoDto.ts b/src/lancamento/dtos/lancamentoDto.ts index fb3a8dd4..6820c985 100644 --- a/src/lancamento/dtos/lancamentoDto.ts +++ b/src/lancamento/dtos/lancamentoDto.ts @@ -37,22 +37,22 @@ export class LancamentoDto { @IsDate() data_lancamento: Date; - @ApiProperty({ example: '1' }) + @ApiProperty({ example: 1 }) @IsNumberString() algoritmo: string; - @ApiProperty({ example: '1' }) - @IsNumberString() - glosa: string; + @ApiProperty({ example: 1 }) + @IsNumber() + glosa: number; - @ApiProperty({ example: '1' }) - @IsNumberString() - recurso: string; + @ApiProperty({ example: 1 }) + @IsNumber() + recurso: number; @ApiProperty() @IsNotEmpty() - @IsString() - anexo: string; + @IsNumber() + anexo: number; @ApiProperty({ type: Number, example: 1.99 }) @IsNumber() diff --git a/src/lancamento/interfaces/lancamento-seed-data.interface.ts b/src/lancamento/interfaces/lancamento-seed-data.interface.ts index 527b1fe7..e2377639 100644 --- a/src/lancamento/interfaces/lancamento-seed-data.interface.ts +++ b/src/lancamento/interfaces/lancamento-seed-data.interface.ts @@ -10,8 +10,8 @@ export interface LancamentoSeedData { data_ordem: Date; data_pgto: Date; algoritmo: string; - glosa: string; - recurso: string; + glosa: number; + recurso: number; valor_a_pagar: number; numero_processo: string; id_cliente_favorecido: DeepPartial; @@ -20,5 +20,5 @@ export interface LancamentoSeedData { user: DeepPartial; /** @example `1,2,3` */ auth_usersIds?: string; - anexo: string; + anexo: number; } diff --git a/src/lancamento/interfaces/lancamento.interface.ts b/src/lancamento/interfaces/lancamento.interface.ts index 4e3cbaef..5a98a04c 100644 --- a/src/lancamento/interfaces/lancamento.interface.ts +++ b/src/lancamento/interfaces/lancamento.interface.ts @@ -12,9 +12,9 @@ export interface ItfLancamento { data_pgto: Date; data_lancamento: Date; algoritmo: string; - glosa: string; - recurso: string; - anexo: string; + glosa: number; + recurso: number; + anexo: number; valor_a_pagar: number; numero_processo: string; id_cliente_favorecido: DeepPartial; diff --git a/src/lancamento/lancamento.entity.ts b/src/lancamento/lancamento.entity.ts index ee35eb08..2c0d0296 100644 --- a/src/lancamento/lancamento.entity.ts +++ b/src/lancamento/lancamento.entity.ts @@ -3,6 +3,7 @@ import { Transacao } from 'src/cnab/entity/pagamento/transacao.entity'; import { User } from 'src/users/entities/user.entity'; import { EntityHelper } from 'src/utils/entity-helper'; import { + AfterLoad, Column, CreateDateColumn, DeepPartial, @@ -13,6 +14,7 @@ import { UpdateDateColumn, } from 'typeorm'; import { ItfLancamento } from './interfaces/lancamento.interface'; +import { asStringOrNumber } from 'src/utils/pipe-utils'; @Entity('lancamento') export class LancamentoEntity extends EntityHelper { @@ -73,14 +75,14 @@ export class LancamentoEntity extends EntityHelper { @Column({ type: 'varchar', nullable: false }) algoritmo: string; - @Column({ type: 'varchar', nullable: false }) - glosa: string; + @Column({ type: 'numeric', nullable: false }) + glosa: number; - @Column({ type: 'varchar', nullable: false }) - recurso: string; + @Column({ type: 'numeric', nullable: false }) + recurso: number; - @Column({ type: 'varchar', nullable: false }) - anexo: string; + @Column({ type: 'numeric', nullable: false }) + anexo: number; @Column({ type: 'numeric', nullable: false }) valor_a_pagar: number; @@ -113,4 +115,12 @@ export class LancamentoEntity extends EntityHelper { autorizadopor: [], }; } + + @AfterLoad() + setReadValues() { + this.glosa = asStringOrNumber(this.glosa); + this.recurso = asStringOrNumber(this.recurso); + this.anexo = asStringOrNumber(this.anexo); + this.valor_a_pagar = asStringOrNumber(this.valor_a_pagar); + } }