diff --git a/Sicoob.Cobranca/Helpers.cs b/Sicoob.Cobranca/Helpers.cs new file mode 100644 index 0000000..9f250a3 --- /dev/null +++ b/Sicoob.Cobranca/Helpers.cs @@ -0,0 +1,25 @@ +namespace Sicoob.Cobranca; + +using Sicoob.Cobranca.Models; +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.IO; + +public static class Helpers +{ + public static IEnumerable ProcessarArquivoMovimentacao(string zipBase64) + { + var bytes = Convert.FromBase64String(zipBase64); + Stream data = new MemoryStream(bytes); + + ZipArchive archive = new ZipArchive(data); + foreach (ZipArchiveEntry entry in archive.Entries) + { + using var sr = new StreamReader(entry.Open()); + var registros = Newtonsoft.Json.JsonConvert.DeserializeObject(sr.ReadToEnd()); + if (registros == null) continue; + foreach (var r in registros) yield return r; + } + } +} diff --git a/Sicoob.Cobranca/Models/Movimentacoes.cs b/Sicoob.Cobranca/Models/Movimentacoes.cs index 1b1a89b..f9be2d4 100644 --- a/Sicoob.Cobranca/Models/Movimentacoes.cs +++ b/Sicoob.Cobranca/Models/Movimentacoes.cs @@ -34,3 +34,32 @@ public class RetornoArquivoMovimentacao public string arquivo { get; set; } public string nomeArquivo { get; set; } } + + +public class MovimentacoesArquivo +{ + public string siglaMovimento { get; set; } + public DateTime dataInicioMovimento { get; set; } + public DateTime dataFimMovimento { get; set; } + public int numeroCliente { get; set; } + public int numeroContrato { get; set; } + public int modalidade { get; set; } + public int numeroTitulo { get; set; } + public string seuNumero { get; set; } + public DateTime dataVencimentoTitulo { get; set; } + public decimal valorTitulo { get; set; } + public string codigoBarras { get; set; } + public int numeroContaCorrente { get; set; } + public decimal valorTarifaMovimento { get; set; } + public decimal valorAbatimento { get; set; } + public DateTime dataMovimentoLiquidacao { get; set; } + public DateTime dataLiquidacao { get; set; } + public DateTime dataPrevisaoCredito { get; set; } + public int numeroBancoRecebedor { get; set; } + public int numeroAgenciaRecebedora { get; set; } + public int idTipoOpFinanceira { get; set; } + public string tipoOpFinanceira { get; set; } + public decimal valorDesconto { get; set; } + public decimal valorMora { get; set; } + public decimal valorLiquido { get; set; } +} diff --git a/Sicoob.Cobranca/SicoobCobranca.cs b/Sicoob.Cobranca/SicoobCobranca.cs index 47c648a..f074ab2 100644 --- a/Sicoob.Cobranca/SicoobCobranca.cs +++ b/Sicoob.Cobranca/SicoobCobranca.cs @@ -9,6 +9,8 @@ namespace Sicoob.Cobranca; using Sicoob.Shared.Models.Acesso; using Simple.API; using System; +using System.Collections.Generic; +using System.Linq; using System.Net.Http; using System.Threading.Tasks; @@ -63,7 +65,7 @@ protected override void atualizaClients(TokenResponse token) linhaDigitavel = linhaDigitavel, codigoBarras = codigoBarras }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync("/cobranca-bancaria/v2/boletos", consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync("/cobranca-bancaria/v2/cobranca-bancaria/v2/boletos", consulta)); } /// @@ -75,7 +77,7 @@ protected override void atualizaClients(TokenResponse token) /// Data de Vencimento Inicial /// Data de Vencimento Final /// Boletos do Pagador - public async Task ConsultarBoletosPagador(int numeroContrato, string numeroCpfCnpj,int? codigoSituacao = null, DateTime? dataVencimentoInicio = null, DateTime? dataVencimentoFim = null) + public async Task ConsultarBoletosPagador(int numeroContrato, string numeroCpfCnpj, int? codigoSituacao = null, DateTime? dataVencimentoInicio = null, DateTime? dataVencimentoFim = null) { var consulta = new ConsultaBoletosPagadorRequest() { @@ -84,7 +86,7 @@ public async Task ConsultarBoletosPagador(int nu dataInicio = dataVencimentoInicio?.ToString("yyyy-MM-dd"), dataFim = dataVencimentoFim?.ToString("yyyy-MM-dd") }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync("/cobranca-bancaria/v2/boletos/pagadores/" + numeroCpfCnpj, consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync("/cobranca-bancaria/v2/cobranca-bancaria/v2/boletos/pagadores/" + numeroCpfCnpj, consulta)); } public async Task ConsultarSegundaViaBoleto(int numeroContrato, int modalidade, int? nossoNumero = null, string? linhaDigitavel = null, string? codigoBarras = null, bool gerarPdf = false) @@ -98,29 +100,47 @@ public async Task ConsultarBoletosPagador(int nu codigoBarras = codigoBarras, gerarPdf = gerarPdf }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync("/cobranca-bancaria/v2/boletos/segunda-via", consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync("/cobranca-bancaria/v2/cobranca-bancaria/v2/boletos/segunda-via", consulta)); } public async Task IncluirBoletos(IncluirBoletosRequest[] boletos) { - return await ExecutaChamadaAsync(() => clientApi.PostAsync("/cobranca-bancaria/v2/boletos", boletos)); + return await ExecutaChamadaAsync(() => clientApi.PostAsync("/cobranca-bancaria/v2/cobranca-bancaria/v2/boletos", boletos)); } /* Movimentação */ - public async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira solicitacao) + public async Task SolicitarMovimentacao(int numeroContrato, int tipoMovimento, DateTime data) { - var retorno = await ExecutaChamadaAsync(() => clientApi.PostAsync>("/boletos/solicitacoes/movimentacao", solicitacao)); + var di = data.Date; + var df = data.Date.AddDays(1).AddSeconds(-1); + return await SolicitarMovimentacao(numeroContrato, tipoMovimento, di, df); + } + public async Task SolicitarMovimentacao(int numeroContrato, int tipoMovimento, DateTime dataInicial, DateTime dataFinal) + => await SolicitarMovimentacao(new SolicitacaoMovimentacoesCarteira() { numeroContrato = numeroContrato, tipoMovimento = tipoMovimento, dataInicial = dataInicial, dataFinal = dataFinal }); + private async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira solicitacao) + { + var retorno = await ExecutaChamadaAsync(() => clientApi.PostAsync>("/cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", solicitacao)); return retorno.resultado; } public async Task ConsultarSituacaoSolicitacao(int numeroContrato, int codigoSolicitacao) { - var retorno = await ExecutaChamadaAsync(() => clientApi.PostAsync>("/boletos/solicitacoes/movimentacao", new { numeroContrato, codigoSolicitacao })); + var retorno = await ExecutaChamadaAsync(() => clientApi.GetAsync>("/cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", new { numeroContrato, codigoSolicitacao })); return retorno.resultado; } - public async Task DownloadMovimentacao(int numeroContrato, int codigoSolicitacao, int idArquivo) + internal async Task DownloadArquivoMovimentacao(int numeroContrato, int codigoSolicitacao, int idArquivo) { - var retorno = await ExecutaChamadaAsync(() => clientApi.PostAsync>("/boletos/movimentacao-download", new { numeroContrato, codigoSolicitacao, idArquivo })); + var retorno = await ExecutaChamadaAsync(() => clientApi.GetAsync>("/cobranca-bancaria/v2/boletos/movimentacao-download", new { numeroContrato, codigoSolicitacao, idArquivo })); return retorno.resultado; } - + public async Task BaixarMovimentacoes(int numeroContrato, int codigoSolicitacao, int[] arquivos) + { + var lst = new List(); + foreach (var idArquivo in arquivos) + { + var retorno = await DownloadArquivoMovimentacao(numeroContrato, codigoSolicitacao, idArquivo); + var registros = Helpers.ProcessarArquivoMovimentacao(retorno.arquivo); + lst.AddRange(registros); + } + return lst.ToArray(); + } }