Skip to content

Commit

Permalink
Merge pull request #285 from RJ-SMTR/239-valor-publicacao
Browse files Browse the repository at this point in the history
feat: cnab remessa retorno sex-qui
  • Loading branch information
williamfl2007 committed May 29, 2024
2 parents c5f9502 + 7c5ad69 commit 6df096f
Show file tree
Hide file tree
Showing 34 changed files with 204 additions and 427 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
9 changes: 5 additions & 4 deletions src/bigquery/services/bigquery-ordem-pagamento.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<BigqueryOrdemPagamentoDTO[]> {
public async getFromWeek(daysBefore = 0): Promise<BigqueryOrdemPagamentoDTO[]> {
// 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;
Expand Down
4 changes: 2 additions & 2 deletions src/bigquery/services/bigquery-transacao.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/cnab/cnab.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
75 changes: 24 additions & 51 deletions src/cnab/cnab.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -86,15 +84,17 @@ 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}
*/
public async saveTransacoesJae() {
const METHOD = this.saveTransacoesJae.name;

await this.compareTransacaoViewPublicacao();

// 1. Update cliente favorecido
await this.updateAllFavorecidosFromUsers();

Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand Down Expand Up @@ -253,25 +256,20 @@ export class CnabService {
pagador: Pagador,
transacaoAgId: number,
): Promise<Transacao> {
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);
}

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,
Expand Down Expand Up @@ -300,7 +298,6 @@ export class CnabService {
nomeOperadora: ordem.operadora,
valor: ordem.valorTotalTransacaoLiquido,
transacaoAgrupado: transacaoAg,
status: new ItemTransacaoStatus(ItemTransacaoStatusEnum.created),
});
return item;
}
Expand All @@ -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)),
Expand All @@ -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);
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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(
Expand Down Expand Up @@ -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;
Expand Down
7 changes: 0 additions & 7 deletions src/cnab/dto/pagamento/item-transacao.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -59,15 +58,9 @@ export class ItemTransacaoDTO {
@IsNotEmpty()
dataOrdem?: Date;


@ValidateIf(isCreate)
@IsNotEmpty()
status?: DeepPartial<ItemTransacaoStatus>;

detalheA?: DeepPartial<DetalheA> | null;

@ValidateIf(isCreate)
@IsNotEmpty()
versaoOrdemPagamento?: string;

}
9 changes: 2 additions & 7 deletions src/cnab/dto/pagamento/transacao.dto.ts
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -28,10 +27,6 @@ export class TransacaoDTO {
@IsNotEmpty()
pagador?: Pagador;

@ValidateIf(isCreate)
@IsNotEmpty()
status?: DeepPartial<TransacaoStatus>;

ocorrencias?: DeepPartial<Ocorrencia>[];

@ValidateIf((obj) => isCreate(obj) && obj.idOrdemPagamento === undefined)
Expand Down
14 changes: 0 additions & 14 deletions src/cnab/entity/arquivo-publicacao.entity.ts
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/cnab/entity/pagamento/detalhe-a.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
7 changes: 0 additions & 7 deletions src/cnab/entity/pagamento/item-transacao-agrupado.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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;

Expand Down
32 changes: 0 additions & 32 deletions src/cnab/entity/pagamento/item-transacao-status.entity.ts

This file was deleted.

Loading

0 comments on commit 6df096f

Please sign in to comment.