From 8684853218a02e667e62817c46951cbcbfcbe196 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Mon, 5 Feb 2024 16:45:58 -0300 Subject: [PATCH 01/13] =?UTF-8?q?Criar=20op=C3=A7=C3=A3o=20de=20Sandbox,?= =?UTF-8?q?=20Retornar=20token=20gerado=20no=20SetupAsync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sicoob.Cobranca/Models/ConsultaBoleto.cs | 2 +- Sicoob.Cobranca/SicoobCobranca.cs | 16 ++--- Sicoob.Shared/Models/Configuracao.cs | 5 ++ Sicoob.Shared/Sicoob.cs | 42 ++++++++--- Sicoob.Testes/TestesApiCobranca.cs | 92 ++++++++++++++++++++++++ 5 files changed, 139 insertions(+), 18 deletions(-) diff --git a/Sicoob.Cobranca/Models/ConsultaBoleto.cs b/Sicoob.Cobranca/Models/ConsultaBoleto.cs index 83ede78..73e2758 100644 --- a/Sicoob.Cobranca/Models/ConsultaBoleto.cs +++ b/Sicoob.Cobranca/Models/ConsultaBoleto.cs @@ -95,7 +95,7 @@ public class Mensagensinstrucao public class Listahistorico { - public DateTime dataHistorico { get; set; } + public DateTime? dataHistorico { get; set; } public string? tipoHistorico { get; set; } public string? descricaoHistorico { get; set; } } diff --git a/Sicoob.Cobranca/SicoobCobranca.cs b/Sicoob.Cobranca/SicoobCobranca.cs index a6dcbda..1983e36 100644 --- a/Sicoob.Cobranca/SicoobCobranca.cs +++ b/Sicoob.Cobranca/SicoobCobranca.cs @@ -43,7 +43,7 @@ public SicoobCobranca(Shared.Models.ConfiguracaoAPI configApi, int NumeroContrat protected override void setupClients(HttpClientHandler handler) { clientApi = new ClientInfo(ConfigApi.UrlApi, handler); - clientApi.SetHeader("x-sicoob-clientid", ConfigApi.ClientId); + clientApi.SetHeader("client_id", ConfigApi.ClientId); } protected override void atualizaClients(TokenResponse token) { @@ -70,7 +70,7 @@ protected override void atualizaClients(TokenResponse token) linhaDigitavel = linhaDigitavel, codigoBarras = codigoBarras }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync("/cobranca-bancaria/v2/cobranca-bancaria/v2/boletos", consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos", consulta)); } /// @@ -91,7 +91,7 @@ public async Task ConsultarBoletosPagador(string dataInicio = dataVencimentoInicio?.ToString("yyyy-MM-dd"), dataFim = dataVencimentoFim?.ToString("yyyy-MM-dd") }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync("/cobranca-bancaria/v2/cobranca-bancaria/v2/boletos/pagadores/" + numeroCpfCnpj, consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos/pagadores/" + numeroCpfCnpj, consulta)); } public async Task ConsultarSegundaViaBoleto(int modalidade, int? nossoNumero = null, string? linhaDigitavel = null, string? codigoBarras = null, bool gerarPdf = false) @@ -105,12 +105,12 @@ public async Task ConsultarBoletosPagador(string codigoBarras = codigoBarras, gerarPdf = gerarPdf }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync("/cobranca-bancaria/v2/cobranca-bancaria/v2/boletos/segunda-via", consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos/segunda-via", consulta)); } public async Task IncluirBoletos(IncluirBoletosRequest[] boletos) { - return await ExecutaChamadaAsync(() => clientApi.PostAsync("/cobranca-bancaria/v2/cobranca-bancaria/v2/boletos", boletos)); + return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos", boletos)); } /* Movimentação */ @@ -124,13 +124,13 @@ public async Task SolicitarMovimentacao => await SolicitarMovimentacao(new SolicitacaoMovimentacoesCarteira() { numeroContrato = numeroContrato, tipoMovimento = (int)tipoMovimento, dataInicial = dataInicial, dataFinal = dataFinal }); private async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira solicitacao) { - var retorno = await ExecutaChamadaAsync(() => clientApi.PostAsync>("/cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", solicitacao)); + var retorno = await ExecutaChamadaAsync(() => clientApi.PostAsync>(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", solicitacao)); return retorno.resultado; } public async Task ConsultarSituacaoSolicitacao(int codigoSolicitacao) { await VerificaAtualizaCredenciaisAsync(); - var result = await clientApi.GetAsync>("/cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", new { numeroContrato, codigoSolicitacao }); + var result = await clientApi.GetAsync>( ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", new { numeroContrato, codigoSolicitacao }); if (result.IsSuccessStatusCode) return result.Data.resultado; @@ -148,7 +148,7 @@ private async Task SolicitarMovimentaca } internal async Task DownloadArquivoMovimentacao(int codigoSolicitacao, int idArquivo) { - var retorno = await ExecutaChamadaAsync(() => clientApi.GetAsync>("/cobranca-bancaria/v2/boletos/movimentacao-download", new { numeroContrato, codigoSolicitacao, idArquivo })); + var retorno = await ExecutaChamadaAsync(() => clientApi.GetAsync>(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos/movimentacao-download", new { numeroContrato, codigoSolicitacao, idArquivo })); return retorno.resultado; } public async Task BaixarMovimentacoes(int codigoSolicitacao, int[] arquivos) diff --git a/Sicoob.Shared/Models/Configuracao.cs b/Sicoob.Shared/Models/Configuracao.cs index 3be92a5..6b2254e 100644 --- a/Sicoob.Shared/Models/Configuracao.cs +++ b/Sicoob.Shared/Models/Configuracao.cs @@ -16,6 +16,11 @@ public class Configuracao /// Id do cliente gerado pelo Sicoob no momento do cadastro do Aplicativo /// public string? ClientId { get; set; } + + /// + /// Teste de Comunicação com API + /// + public bool SandBox { get; set; } /// /// Caminho do certificado com chave pública /// diff --git a/Sicoob.Shared/Sicoob.cs b/Sicoob.Shared/Sicoob.cs index 46bcb1a..aed91b5 100644 --- a/Sicoob.Shared/Sicoob.cs +++ b/Sicoob.Shared/Sicoob.cs @@ -3,6 +3,9 @@ * Autor: Rafael Estevam * * gh/SharpSistemas/SicoobAPI * \**************************************/ + +using Sicoob.Shared.Models.Acesso; + namespace Sicoob.Shared; using global::Sicoob.Shared.Models.Geral; @@ -17,6 +20,7 @@ public abstract class Sicoob private readonly Models.Configuracao config; private readonly HttpClientHandler httpHandler; private ClientInfo clientAuth; + private const string SandBoxToken = "1301865f-c6bc-38f3-9f49-666dbcfc59c3"; public DateTime ExpiresAtUTC { get; private set; } public TimeSpan ExpiresIn => ExpiresAtUTC - DateTime.UtcNow; @@ -74,17 +78,24 @@ private void debugLog(string direciton, string content) System.IO.File.AppendAllText("debug.log", $"{DateTime.Now:G} {direciton} {content}\r\n"); } - public async Task SetupAsync() + public async Task SetupAsync(string? token = null, DateTime? expiresIn = null) { setupClients(httpHandler); - await atualizaCredenciaisAsync(); + + if (token is null) + expiresIn = null; + + if (expiresIn is not null) + ExpiresAtUTC = expiresIn.Value.ToUniversalTime(); + + return await VerificaAtualizaCredenciaisAsync(); } protected abstract void setupClients(HttpClientHandler handler); protected abstract void atualizaClients(Models.Acesso.TokenResponse token); public async Task AtualizarCredenciaisAsync() => await atualizaCredenciaisAsync(); - private async Task atualizaCredenciaisAsync() + private async Task atualizaCredenciaisAsync() { var response = await clientAuth.FormUrlEncodedPostAsync("token", new { @@ -92,20 +103,33 @@ private async Task atualizaCredenciaisAsync() grant_type = "client_credentials", scope = config.Scope.ToScopeString(), }); + + if (config.SandBox) + { + atualizaClients(new TokenResponse(){ access_token = SandBoxToken }); + var data = DateTime.Now.AddHours(1); + var totalSeconds = Convert.ToInt32((DateTime.Now - data).TotalSeconds); + ExpiresAtUTC = DateTime.UtcNow.AddSeconds(totalSeconds); + + return new TokenResponse() + { + access_token = SandBoxToken, + expires_in = totalSeconds + }; + } + response.EnsureSuccessStatusCode(); atualizaClients(response.Data); ExpiresAtUTC = DateTime.UtcNow.AddSeconds(response.Data.expires_in); + return response.Data; } - protected async Task VerificaAtualizaCredenciaisAsync() + protected async Task VerificaAtualizaCredenciaisAsync() { if (ExpiresIn.TotalSeconds >= 5) - { - return false; - } + return null; - await atualizaCredenciaisAsync(); - return true; + return await atualizaCredenciaisAsync(); } protected async Task ExecutaChamadaAsync(Func>> func) { diff --git a/Sicoob.Testes/TestesApiCobranca.cs b/Sicoob.Testes/TestesApiCobranca.cs index 2a49739..ab8b931 100644 --- a/Sicoob.Testes/TestesApiCobranca.cs +++ b/Sicoob.Testes/TestesApiCobranca.cs @@ -3,6 +3,9 @@ * Autor: Rafael Estevam * * gh/SharpSistemas/SicoobAPI * \**************************************/ + +using Sicoob.Cobranca.Models; + namespace Sicoob.Testes; using Newtonsoft.Json; @@ -25,6 +28,95 @@ internal static async Task Run_Cobranca() var cobranca = new SicoobCobranca(cfg, NumeroContrato: 000); await cobranca.SetupAsync(); + var boleto = await cobranca.IncluirBoletos(new [] + { + new IncluirBoletosRequest() + { + numeroContrato= 25546454, + modalidade= 1, + numeroContaCorrente= 0, + especieDocumento= "DM", + dataEmissao= new DateTime(2018,09, 20).ToUniversalTime(), + nossoNumero= 2588658, + seuNumero= "1235512", + identificacaoBoletoEmpresa= "4562", + identificacaoEmissaoBoleto= 1, + identificacaoDistribuicaoBoleto= 1, + valor= 156.23m, + dataVencimento= new DateTime(2018,09, 20).ToUniversalTime(), + dataLimitePagamento= new DateTime(2018,09, 20).ToUniversalTime(), + valorAbatimento= 1, + tipoDesconto= 1, + dataPrimeiroDesconto= new DateTime(2018,09, 20).ToUniversalTime(), + valorPrimeiroDesconto= 1, + dataSegundoDesconto= new DateTime(2018,09, 20).ToUniversalTime(), + valorSegundoDesconto= 0, + dataTerceiroDesconto= new DateTime(2018,09, 20).ToUniversalTime(), + valorTerceiroDesconto= 0, + tipoMulta= 1, + dataMulta= new DateTime(2018,09, 20).ToUniversalTime(), + valorMulta= 5, + tipoJurosMora= 1, + dataJurosMora= new DateTime(2018,09, 20).ToUniversalTime(), + valorJurosMora= 4, + numeroParcela= 1, + aceite= true, + codigoNegativacao= 2, + numeroDiasNegativacao= 60, + codigoProtesto= 1, + numeroDiasProtesto= 30, + pagador = new DadosPagador() + { + numeroCpfCnpj = "98765432185", + nome = "Marcelo dos Santos", + endereco = "Rua 87 Quadra 1 Lote 1 casa 1", + bairro = "Santa Rosa", + cidade = "Luziânia", + cep = "72320000", + uf = "DF", + email = new[] { + "pagador@dominio.com.br" + }, + }, + beneficiarioFinal = new Beneficiariofinal() + { + numeroCpfCnpj = "98784978699", + nome = "Lucas de Lima" + }, + mensagensInstrucao = new Mensagensinstrucao() + { + tipoInstrucao = 1, + mensagens = new [] { + "Descrição da Instrução 1", + "Descrição da Instrução 2", + "Descrição da Instrução 3", + "Descrição da Instrução 4", + "Descrição da Instrução 5" + } + }, + rateioCreditos = new [] { + new Rateiocredito() + { + numeroBanco = 756, + numeroAgencia = 4027, + numeroContaCorrente = 0, + contaPrincipal = true, + codigoTipoValorRateio = 1, + valorRateio = 156.23m, + codigoTipoCalculoRateio = 1, + numeroCpfCnpjTitular = "98765432185", + nomeTitular = "Marcelo dos Santos", + codigoFinalidadeTed = 10, + codigoTipoContaDestinoTed = "CC", + quantidadeDiasFloat = 1, + dataFloatCredito = "2020-12-30" + } + }, + gerarPdf = true, + codigoCadastrarPIX = 1 + } + }); + //var boleto = await cobranca.ConsultarBoleto(nossoNumero: 0); //var consulta = await cobranca.ConsultarBoletosPagador(numeroCpfCnpj: "00000000000000"); //var segVia = await cobranca.ConsultarSegundaViaBoleto(1, nossoNumero: 0, gerarPdf: true); From 717a96aa3237586f97332c267aa66d8ee1f6b5e1 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Mon, 5 Feb 2024 17:14:43 -0300 Subject: [PATCH 02/13] Remover retorno token em SetupAsync --- Sicoob.Shared/Sicoob.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Sicoob.Shared/Sicoob.cs b/Sicoob.Shared/Sicoob.cs index aed91b5..66c462b 100644 --- a/Sicoob.Shared/Sicoob.cs +++ b/Sicoob.Shared/Sicoob.cs @@ -78,17 +78,10 @@ private void debugLog(string direciton, string content) System.IO.File.AppendAllText("debug.log", $"{DateTime.Now:G} {direciton} {content}\r\n"); } - public async Task SetupAsync(string? token = null, DateTime? expiresIn = null) + public async Task SetupAsync() { setupClients(httpHandler); - - if (token is null) - expiresIn = null; - - if (expiresIn is not null) - ExpiresAtUTC = expiresIn.Value.ToUniversalTime(); - - return await VerificaAtualizaCredenciaisAsync(); + await atualizaCredenciaisAsync(); } protected abstract void setupClients(HttpClientHandler handler); protected abstract void atualizaClients(Models.Acesso.TokenResponse token); From 696dd57e15a53292a91bc19eeb06fdd329d48de8 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Mon, 26 Feb 2024 09:44:07 -0300 Subject: [PATCH 03/13] =?UTF-8?q?Ajustar=20endpoint=20baixa=20de=20boleto;?= =?UTF-8?q?=20melhorias=20ao=20gerar=20o=20token=20criando=20evento;=20aju?= =?UTF-8?q?star=20propriedades=20DateTime=20para=20enviar=20do=20formato?= =?UTF-8?q?=20correto;=20colocar=20propeidades=20para=20n=C3=A3o=20enviar?= =?UTF-8?q?=20caso=20for=20null=20ao=20incluir=20boleto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataAnotation/CustomDateTimeConverter.cs | 9 ++ Sicoob.Cobranca/Models/BaixarBoleto.cs | 17 ++++ Sicoob.Cobranca/Models/BoletoBase.cs | 12 +++ Sicoob.Cobranca/Models/ConsultaBoleto.cs | 4 +- Sicoob.Cobranca/Models/Enum.cs | 84 +++++++++++++++++++ Sicoob.Cobranca/Models/IncluirBoletos.cs | 45 ++++++---- Sicoob.Cobranca/Models/ResultadoInfo.cs | 7 ++ Sicoob.Cobranca/SicoobCobranca.cs | 40 +++++++-- Sicoob.Shared/Models/Configuracao.cs | 22 +++++ Sicoob.Shared/Sicoob.cs | 7 +- Sicoob.Testes/TestesApiCobranca.cs | 26 +++--- 11 files changed, 230 insertions(+), 43 deletions(-) create mode 100644 Sicoob.Cobranca/DataAnotation/CustomDateTimeConverter.cs create mode 100644 Sicoob.Cobranca/Models/BaixarBoleto.cs create mode 100644 Sicoob.Cobranca/Models/BoletoBase.cs create mode 100644 Sicoob.Cobranca/Models/Enum.cs create mode 100644 Sicoob.Cobranca/Models/ResultadoInfo.cs diff --git a/Sicoob.Cobranca/DataAnotation/CustomDateTimeConverter.cs b/Sicoob.Cobranca/DataAnotation/CustomDateTimeConverter.cs new file mode 100644 index 0000000..aa84962 --- /dev/null +++ b/Sicoob.Cobranca/DataAnotation/CustomDateTimeConverter.cs @@ -0,0 +1,9 @@ +using Newtonsoft.Json.Converters; + +public class CustomDateTimeConverter : IsoDateTimeConverter +{ + public CustomDateTimeConverter() + { + DateTimeFormat = "yyyy-MM-ddTHH:mm:sszzz"; + } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/BaixarBoleto.cs b/Sicoob.Cobranca/Models/BaixarBoleto.cs new file mode 100644 index 0000000..6b052ba --- /dev/null +++ b/Sicoob.Cobranca/Models/BaixarBoleto.cs @@ -0,0 +1,17 @@ +namespace Sicoob.Cobranca.Models; + +public class BaixarBoletoRequest : BoletoBase +{ + +} + +public class BaixarBoletoResponse +{ + public DadosBaixa[]? resultado { get; set; } + public ResultadoInfo? mensagens { get; set; } +} +public class DadosBaixa +{ + public ResultadoInfo? status { get; set; } + public BaixarBoletoRequest? boleto { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/BoletoBase.cs b/Sicoob.Cobranca/Models/BoletoBase.cs new file mode 100644 index 0000000..49a209f --- /dev/null +++ b/Sicoob.Cobranca/Models/BoletoBase.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace Sicoob.Cobranca.Models; + +public abstract class BoletoBase +{ + public int numeroContrato { get; set; } + public int modalidade { get; set; } = 1; // Simples com Registro + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public int? nossoNumero { get; set; } + public string seuNumero { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/ConsultaBoleto.cs b/Sicoob.Cobranca/Models/ConsultaBoleto.cs index 73e2758..8b981c9 100644 --- a/Sicoob.Cobranca/Models/ConsultaBoleto.cs +++ b/Sicoob.Cobranca/Models/ConsultaBoleto.cs @@ -51,7 +51,7 @@ public class DadosBoleto public DateTime dataVencimento { get; set; } public DateTime dataLimitePagamento { get; set; } public decimal valorAbatimento { get; set; } - public int tipoDesconto { get; set; } + public string tipoDesconto { get; set; } public DateTime dataPrimeiroDesconto { get; set; } public decimal valorPrimeiroDesconto { get; set; } public DateTime dataSegundoDesconto { get; set; } @@ -96,7 +96,7 @@ public class Mensagensinstrucao public class Listahistorico { public DateTime? dataHistorico { get; set; } - public string? tipoHistorico { get; set; } + public int? tipoHistorico { get; set; } public string? descricaoHistorico { get; set; } } diff --git a/Sicoob.Cobranca/Models/Enum.cs b/Sicoob.Cobranca/Models/Enum.cs new file mode 100644 index 0000000..d55bf38 --- /dev/null +++ b/Sicoob.Cobranca/Models/Enum.cs @@ -0,0 +1,84 @@ +namespace Sicoob.Cobranca.Models; + + + public enum IdentificacaoEmissaoBoleto: int + { + BancoEmite = 1, + ClienteEmite = 2 + } + + public enum IdentificacaoDistribuicaoBoleto : int + { + BancoDistribui = 1, + ClienteDistribui = 2 + } + + public enum TipoDesconto : int + { + SemDesconto = 0, + ValorFixoAteDataInformada = 1, + PercentualAteDataInformada = 2, + ValorPorAntecipacaoDiaCorrido = 3, + ValorPorAntecipacaoDiaUtil = 4, + PercentualPorAntecipacaoDiaCorrido = 5, + PercentualPorAntecipacaoDiaUtil = 6 + } + + public enum TipoJurosMora : int + { + ValorPorDia = 1, + TaxaMensal = 2, + Isento = 3 + } + + public enum TipoMulta : int + { + Isento = 0, + ValorFixo = 1, + Percentual = 2 + } + + public enum CodigoNegativacao : int + { + NegativarDiasUteis = 2, + NaoNegativar = 3 + } + + public enum CodigoProtesto : int + { + ProtestarDiasCorridos = 1, + ProtestarDiasUteis = 2, + NaoProtestar = 3, + } + + public enum CodigoCadastrarPIX : int + { + Padrao = 0, + ComPIX = 1, + SemPIX = 1 + } + + public enum Modalidade : int + { + SimplesComRegistro = 1, + CarneDePagamentos = 5, + Indexada = 6, + CartaoDeCredito = 14 + } + public struct SituacaoBoleto + { + public const string Liquidado = "Liquidado"; + public const string EmAberto = "Em Aberto"; + public const string Baixado = "Baixado"; + } + + public enum TipoHistorico : int + { + Entrada = 1, + Alteracao = 2, + Prorrogacao = 3, + Terifas = 4, + Protesto = 5, + LiquidacaoBaixa = 6 + } + \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/IncluirBoletos.cs b/Sicoob.Cobranca/Models/IncluirBoletos.cs index 45b515c..3692da1 100644 --- a/Sicoob.Cobranca/Models/IncluirBoletos.cs +++ b/Sicoob.Cobranca/Models/IncluirBoletos.cs @@ -1,34 +1,46 @@ -namespace Sicoob.Cobranca.Models; +using Newtonsoft.Json; + +namespace Sicoob.Cobranca.Models; using System; -public class IncluirBoletosRequest +public class IncluirBoletosRequest : BoletoBase { - public int numeroContrato { get; set; } - public int modalidade { get; set; } = 1; // Simples com Registro public int numeroContaCorrente { get; set; } public string especieDocumento { get; set; } = "DM"; // Duplicata Mercantil, ver lista + + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataEmissao { get; set; } - public int nossoNumero { get; set; } - public string seuNumero { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public string identificacaoBoletoEmpresa { get; set; } public int identificacaoEmissaoBoleto { get; set; } public int identificacaoDistribuicaoBoleto { get; set; } public decimal valor { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataVencimento { get; set; } - public DateTime dataLimitePagamento { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public DateTime? dataLimitePagamento { get; set; } public int valorAbatimento { get; set; } public int tipoDesconto { get; set; } - public DateTime dataPrimeiroDesconto { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public DateTime? dataPrimeiroDesconto { get; set; } public decimal valorPrimeiroDesconto { get; set; } - public DateTime dataSegundoDesconto { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public DateTime? dataSegundoDesconto { get; set; } public decimal valorSegundoDesconto { get; set; } - public DateTime dataTerceiroDesconto { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public DateTime? dataTerceiroDesconto { get; set; } public decimal valorTerceiroDesconto { get; set; } public int tipoMulta { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataMulta { get; set; } public decimal valorMulta { get; set; } public int tipoJurosMora { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataJurosMora { get; set; } public decimal valorJurosMora { get; set; } public int numeroParcela { get; set; } @@ -41,12 +53,14 @@ public class IncluirBoletosRequest public Beneficiariofinal beneficiarioFinal { get; set; } public Mensagensinstrucao mensagensInstrucao { get; set; } public bool gerarPdf { get; set; } - public Rateiocredito[] rateioCreditos { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public Rateiocredito?[] rateioCreditos { get; set; } /// /// 0: Padrão, 1: Com PIX, 2: Sem PIX /// public int codigoCadastrarPIX { get; set; } - public int numeroContratoCobranca { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public int? numeroContratoCobranca { get; set; } } public class IncluirBoletosResponse @@ -55,11 +69,6 @@ public class IncluirBoletosResponse } public class DadosInclusao { - public ResultadoInclusao? status { get; set; } + public ResultadoInfo? status { get; set; } public DadosBoleto? boleto { get; set; } -} -public class ResultadoInclusao -{ - public int codigo { get; set; } - public string mensagem { get; set; } = string.Empty; } \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/ResultadoInfo.cs b/Sicoob.Cobranca/Models/ResultadoInfo.cs new file mode 100644 index 0000000..157baeb --- /dev/null +++ b/Sicoob.Cobranca/Models/ResultadoInfo.cs @@ -0,0 +1,7 @@ +namespace Sicoob.Cobranca.Models; + +public class ResultadoInfo +{ + public int codigo { get; set; } + public string mensagem { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/Sicoob.Cobranca/SicoobCobranca.cs b/Sicoob.Cobranca/SicoobCobranca.cs index 1983e36..bfc5219 100644 --- a/Sicoob.Cobranca/SicoobCobranca.cs +++ b/Sicoob.Cobranca/SicoobCobranca.cs @@ -3,6 +3,9 @@ * Autor: Rafael Estevam * * gh/SharpSistemas/SicoobAPI * \**************************************/ + +using Sicoob.Shared.Models; + namespace Sicoob.Cobranca; using Sicoob.Cobranca.Models; @@ -31,6 +34,8 @@ public sealed class SicoobCobranca : Shared.Sicoob private ClientInfo clientApi; public Shared.Models.ConfiguracaoAPI ConfigApi { get; } public string? PastaCopiaMovimentacoes { get; set; } + public delegate void UpdateToken(ConfiguracaoToken token); + public event UpdateToken UpdateTokenEvent; public SicoobCobranca(Shared.Models.ConfiguracaoAPI configApi, int NumeroContrato, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) : base(configApi, certificado) @@ -44,9 +49,21 @@ protected override void setupClients(HttpClientHandler handler) { clientApi = new ClientInfo(ConfigApi.UrlApi, handler); clientApi.SetHeader("client_id", ConfigApi.ClientId); + + if (ConfigApi.Token is not null) + clientApi.SetAuthorizationBearer(ConfigApi.Token.Token); } protected override void atualizaClients(TokenResponse token) { + ConfigApi.Token = new ConfiguracaoToken() + { + ExpiresAtUTC = DateTime.UtcNow.AddSeconds(token.expires_in), + Token = token.access_token + }; + //Notificar quando o token foi atualizado + if (UpdateTokenEvent is not null) + UpdateTokenEvent(ConfigApi.Token); + clientApi.SetAuthorizationBearer(token.access_token); } @@ -55,22 +72,22 @@ protected override void atualizaClients(TokenResponse token) /// /// Consulta boleto utilizando um dos três métodos de busca /// - /// Número que identifica o contrato do beneficiário no Sisbr + /// /// Número identificador do boleto no Sisbr. Caso seja infomado, não é necessário infomar a linha digitável ou código de barras /// Número da linha digitável do boleto com 47 posições. Caso seja informado, não é necessário informar o nosso número ou código de barras /// Número de código de barras do boleto com 44 posições.Caso seja informado, não é necessário informar o nosso número ou linha digitável /// Boleto buscado - public async Task ConsultarBoleto(int? nossoNumero = null, string? linhaDigitavel = null, string? codigoBarras = null) + public async Task ConsultarBoleto(int? nossoNumero = null, string? linhaDigitavel = null, string? codigoBarras = null, int modalidade = (int)Modalidade.SimplesComRegistro) { var consulta = new ConsultaBoletoRequest() { - modalidade = 1, + modalidade = modalidade, numeroContrato = numeroContrato, nossoNumero = nossoNumero, linhaDigitavel = linhaDigitavel, codigoBarras = codigoBarras }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos", consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos", consulta)); } /// @@ -91,7 +108,7 @@ public async Task ConsultarBoletosPagador(string dataInicio = dataVencimentoInicio?.ToString("yyyy-MM-dd"), dataFim = dataVencimentoFim?.ToString("yyyy-MM-dd") }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos/pagadores/" + numeroCpfCnpj, consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/pagadores/" + numeroCpfCnpj, consulta)); } public async Task ConsultarSegundaViaBoleto(int modalidade, int? nossoNumero = null, string? linhaDigitavel = null, string? codigoBarras = null, bool gerarPdf = false) @@ -105,12 +122,17 @@ public async Task ConsultarBoletosPagador(string codigoBarras = codigoBarras, gerarPdf = gerarPdf }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos/segunda-via", consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/segunda-via", consulta)); } public async Task IncluirBoletos(IncluirBoletosRequest[] boletos) { - return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos", boletos)); + return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos", boletos)); + } + + public async Task BaixarBoletos(BaixarBoletoRequest[] boletos) + { + return await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/baixa", boletos)); } /* Movimentação */ @@ -124,13 +146,13 @@ public async Task SolicitarMovimentacao => await SolicitarMovimentacao(new SolicitacaoMovimentacoesCarteira() { numeroContrato = numeroContrato, tipoMovimento = (int)tipoMovimento, dataInicial = dataInicial, dataFinal = dataFinal }); private async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira solicitacao) { - var retorno = await ExecutaChamadaAsync(() => clientApi.PostAsync>(ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", solicitacao)); + var retorno = await ExecutaChamadaAsync(() => clientApi.PostAsync>(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", solicitacao)); return retorno.resultado; } public async Task ConsultarSituacaoSolicitacao(int codigoSolicitacao) { await VerificaAtualizaCredenciaisAsync(); - var result = await clientApi.GetAsync>( ConfigApi.UrlApi + "/cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", new { numeroContrato, codigoSolicitacao }); + var result = await clientApi.GetAsync>( ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/solicitacoes/movimentacao", new { numeroContrato, codigoSolicitacao }); if (result.IsSuccessStatusCode) return result.Data.resultado; diff --git a/Sicoob.Shared/Models/Configuracao.cs b/Sicoob.Shared/Models/Configuracao.cs index 6b2254e..21010b1 100644 --- a/Sicoob.Shared/Models/Configuracao.cs +++ b/Sicoob.Shared/Models/Configuracao.cs @@ -3,6 +3,9 @@ * Autor: Rafael Estevam * * gh/SharpSistemas/SicoobAPI * \**************************************/ + +using System; + namespace Sicoob.Shared.Models; public class Configuracao @@ -21,6 +24,12 @@ public class Configuracao /// Teste de Comunicação com API /// public bool SandBox { get; set; } + + /// + /// Ultimo token gerado + /// + public ConfiguracaoToken? Token { get; set; } + /// /// Caminho do certificado com chave pública /// @@ -41,3 +50,16 @@ public class ConfiguracaoAPI : Configuracao /// public string UrlApi { get; set; } = "https://api.sicoob.com.br/"; } + +public class ConfiguracaoToken +{ + /// + /// Último token gerado + /// + public string? Token { get; set; } + + /// + /// Data de expiração do Útimo token gerado + /// + public DateTime ExpiresAtUTC { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Shared/Sicoob.cs b/Sicoob.Shared/Sicoob.cs index 66c462b..c43512e 100644 --- a/Sicoob.Shared/Sicoob.cs +++ b/Sicoob.Shared/Sicoob.cs @@ -81,7 +81,12 @@ private void debugLog(string direciton, string content) public async Task SetupAsync() { setupClients(httpHandler); - await atualizaCredenciaisAsync(); + if (config.Token is null) + await atualizaCredenciaisAsync(); + else + { + ExpiresAtUTC = config.Token.ExpiresAtUTC; + } } protected abstract void setupClients(HttpClientHandler handler); protected abstract void atualizaClients(Models.Acesso.TokenResponse token); diff --git a/Sicoob.Testes/TestesApiCobranca.cs b/Sicoob.Testes/TestesApiCobranca.cs index ab8b931..fe7ef5c 100644 --- a/Sicoob.Testes/TestesApiCobranca.cs +++ b/Sicoob.Testes/TestesApiCobranca.cs @@ -28,42 +28,42 @@ internal static async Task Run_Cobranca() var cobranca = new SicoobCobranca(cfg, NumeroContrato: 000); await cobranca.SetupAsync(); - var boleto = await cobranca.IncluirBoletos(new [] + /*var boleto = await cobranca.IncluirBoletos(new [] { new IncluirBoletosRequest() { numeroContrato= 25546454, - modalidade= 1, + modalidade= (int)Modalidade.SimplesComRegistro, numeroContaCorrente= 0, especieDocumento= "DM", dataEmissao= new DateTime(2018,09, 20).ToUniversalTime(), nossoNumero= 2588658, seuNumero= "1235512", identificacaoBoletoEmpresa= "4562", - identificacaoEmissaoBoleto= 1, - identificacaoDistribuicaoBoleto= 1, + identificacaoEmissaoBoleto= (int)IdentificacaoEmissaoBoleto.BancoEmite, + identificacaoDistribuicaoBoleto= (int)IdentificacaoDistribuicaoBoleto.BancoDistribui, valor= 156.23m, dataVencimento= new DateTime(2018,09, 20).ToUniversalTime(), dataLimitePagamento= new DateTime(2018,09, 20).ToUniversalTime(), valorAbatimento= 1, - tipoDesconto= 1, + tipoDesconto= (int)TipoDesconto.ValorFixoAteDataInformada, dataPrimeiroDesconto= new DateTime(2018,09, 20).ToUniversalTime(), valorPrimeiroDesconto= 1, dataSegundoDesconto= new DateTime(2018,09, 20).ToUniversalTime(), valorSegundoDesconto= 0, dataTerceiroDesconto= new DateTime(2018,09, 20).ToUniversalTime(), valorTerceiroDesconto= 0, - tipoMulta= 1, + tipoMulta= (int)TipoMulta.ValorFixo, dataMulta= new DateTime(2018,09, 20).ToUniversalTime(), valorMulta= 5, - tipoJurosMora= 1, + tipoJurosMora= (int)TipoJurosMora.ValorPorDia, dataJurosMora= new DateTime(2018,09, 20).ToUniversalTime(), valorJurosMora= 4, numeroParcela= 1, aceite= true, - codigoNegativacao= 2, + codigoNegativacao= (int)CodigoNegativacao.NegativarDiasUteis, numeroDiasNegativacao= 60, - codigoProtesto= 1, + codigoProtesto= (int)CodigoProtesto.ProtestarDiasCorridos, numeroDiasProtesto= 30, pagador = new DadosPagador() { @@ -113,15 +113,15 @@ internal static async Task Run_Cobranca() } }, gerarPdf = true, - codigoCadastrarPIX = 1 + codigoCadastrarPIX = (int)CodigoCadastrarPIX.Padrao } - }); - + });*/ + //var bol = await cobranca.ConsultarBoletosPagador("98765432185", dataVencimentoInicio: new DateTime(2024,01,01), dataVencimentoFim: new DateTime(2024,02,24) ); //var boleto = await cobranca.ConsultarBoleto(nossoNumero: 0); //var consulta = await cobranca.ConsultarBoletosPagador(numeroCpfCnpj: "00000000000000"); //var segVia = await cobranca.ConsultarSegundaViaBoleto(1, nossoNumero: 0, gerarPdf: true); - var p1 = await cobranca.SolicitarMovimentacao(Cobranca.Models.SolicitacaoMovimentacoesCarteira.Tipo.Liquidacao, new DateTime(2023, 12, 14)); + var p1 = await cobranca.SolicitarMovimentacao(Cobranca.Models.SolicitacaoMovimentacoesCarteira.Tipo.Liquidacao, new DateTime(2024, 02, 20), new DateTime(2024, 02, 23)); int codigo = p1.codigoSolicitacao; Cobranca.Models.RetornoConsultaMovimentacoes? p2 = null; From e1562478c6836d984a2d9de8026c6e9f090d12b1 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Tue, 27 Feb 2024 08:18:12 -0300 Subject: [PATCH 04/13] Criar request do endpoint de protesto de boleto --- Sicoob.Cobranca/Models/BaixarBoleto.cs | 2 +- Sicoob.Cobranca/Models/BoletoBase.cs | 1 - Sicoob.Cobranca/Models/IncluirBoletos.cs | 1 + Sicoob.Cobranca/Models/ProtestarBoleto.cs | 17 +++++++++++++++++ Sicoob.Cobranca/SicoobCobranca.cs | 5 +++++ 5 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 Sicoob.Cobranca/Models/ProtestarBoleto.cs diff --git a/Sicoob.Cobranca/Models/BaixarBoleto.cs b/Sicoob.Cobranca/Models/BaixarBoleto.cs index 6b052ba..ef6b7c6 100644 --- a/Sicoob.Cobranca/Models/BaixarBoleto.cs +++ b/Sicoob.Cobranca/Models/BaixarBoleto.cs @@ -2,7 +2,7 @@ public class BaixarBoletoRequest : BoletoBase { - + public string seuNumero { get; set; } } public class BaixarBoletoResponse diff --git a/Sicoob.Cobranca/Models/BoletoBase.cs b/Sicoob.Cobranca/Models/BoletoBase.cs index 49a209f..35bfb57 100644 --- a/Sicoob.Cobranca/Models/BoletoBase.cs +++ b/Sicoob.Cobranca/Models/BoletoBase.cs @@ -8,5 +8,4 @@ public abstract class BoletoBase public int modalidade { get; set; } = 1; // Simples com Registro [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public int? nossoNumero { get; set; } - public string seuNumero { get; set; } } \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/IncluirBoletos.cs b/Sicoob.Cobranca/Models/IncluirBoletos.cs index 3692da1..5c1b596 100644 --- a/Sicoob.Cobranca/Models/IncluirBoletos.cs +++ b/Sicoob.Cobranca/Models/IncluirBoletos.cs @@ -11,6 +11,7 @@ public class IncluirBoletosRequest : BoletoBase [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataEmissao { get; set; } + public string seuNumero { get; set; } [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public string identificacaoBoletoEmpresa { get; set; } public int identificacaoEmissaoBoleto { get; set; } diff --git a/Sicoob.Cobranca/Models/ProtestarBoleto.cs b/Sicoob.Cobranca/Models/ProtestarBoleto.cs new file mode 100644 index 0000000..cae5c79 --- /dev/null +++ b/Sicoob.Cobranca/Models/ProtestarBoleto.cs @@ -0,0 +1,17 @@ +namespace Sicoob.Cobranca.Models; + +public class ProtestarBoletoRequest: BoletoBase +{ + public int? numeroContratoCobranca { get; set; } +} + +public class ProtestarBoletoResponse +{ + public DadosBaixa[]? resultado { get; set; } + public ResultadoInfo? mensagens { get; set; } +} +public class DadosProtestar +{ + public ResultadoInfo? status { get; set; } + public ProtestarBoletoRequest? boleto { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/SicoobCobranca.cs b/Sicoob.Cobranca/SicoobCobranca.cs index bfc5219..34f4c0a 100644 --- a/Sicoob.Cobranca/SicoobCobranca.cs +++ b/Sicoob.Cobranca/SicoobCobranca.cs @@ -134,6 +134,11 @@ public async Task ConsultarBoletosPagador(string { return await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/baixa", boletos)); } + + public async Task ProtestarBoletos(ProtestarBoletoRequest[] boletos) + { + return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/protestos", boletos)); + } /* Movimentação */ public async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira.Tipo tipoMovimento, DateTime data) From 4b38a00c0980f404476cc27ed1e7d82fe2931ce1 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Tue, 27 Feb 2024 08:25:26 -0300 Subject: [PATCH 05/13] =?UTF-8?q?ProtestarBoletoRequest,=20propriedade=20n?= =?UTF-8?q?umeroContratoCobranca,=20se=20null=20n=C3=A3o=20enviar=20no=20r?= =?UTF-8?q?equest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sicoob.Cobranca/Models/ProtestarBoleto.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Sicoob.Cobranca/Models/ProtestarBoleto.cs b/Sicoob.Cobranca/Models/ProtestarBoleto.cs index cae5c79..8c9a0ae 100644 --- a/Sicoob.Cobranca/Models/ProtestarBoleto.cs +++ b/Sicoob.Cobranca/Models/ProtestarBoleto.cs @@ -1,7 +1,10 @@ -namespace Sicoob.Cobranca.Models; +using Newtonsoft.Json; + +namespace Sicoob.Cobranca.Models; public class ProtestarBoletoRequest: BoletoBase { + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public int? numeroContratoCobranca { get; set; } } From a879437905c20210fa1e41171f49b9eebd753bf5 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Wed, 28 Feb 2024 11:14:15 -0300 Subject: [PATCH 06/13] Criar pacotes ao buildar o projeto --- .idea/.idea.PIX-Sicoob/.idea/.gitignore | 13 +++++++++++++ .idea/.idea.PIX-Sicoob/.idea/.name | 1 + .idea/.idea.PIX-Sicoob/.idea/encodings.xml | 4 ++++ .idea/.idea.PIX-Sicoob/.idea/indexLayout.xml | 8 ++++++++ .idea/.idea.PIX-Sicoob/.idea/vcs.xml | 6 ++++++ Sicoob.Cobranca/Sicoob.Cobranca.csproj | 1 + Sicoob.Conta/Sicoob.Conta.csproj | 1 + Sicoob.PIX/Sicoob.PIX.csproj | 1 + Sicoob.Shared/Sicoob.Shared.csproj | 1 + 9 files changed, 36 insertions(+) create mode 100644 .idea/.idea.PIX-Sicoob/.idea/.gitignore create mode 100644 .idea/.idea.PIX-Sicoob/.idea/.name create mode 100644 .idea/.idea.PIX-Sicoob/.idea/encodings.xml create mode 100644 .idea/.idea.PIX-Sicoob/.idea/indexLayout.xml create mode 100644 .idea/.idea.PIX-Sicoob/.idea/vcs.xml diff --git a/.idea/.idea.PIX-Sicoob/.idea/.gitignore b/.idea/.idea.PIX-Sicoob/.idea/.gitignore new file mode 100644 index 0000000..dea62f2 --- /dev/null +++ b/.idea/.idea.PIX-Sicoob/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/projectSettingsUpdater.xml +/.idea.PIX-Sicoob.iml +/contentModel.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.PIX-Sicoob/.idea/.name b/.idea/.idea.PIX-Sicoob/.idea/.name new file mode 100644 index 0000000..b9059a6 --- /dev/null +++ b/.idea/.idea.PIX-Sicoob/.idea/.name @@ -0,0 +1 @@ +PIX-Sicoob \ No newline at end of file diff --git a/.idea/.idea.PIX-Sicoob/.idea/encodings.xml b/.idea/.idea.PIX-Sicoob/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.PIX-Sicoob/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.PIX-Sicoob/.idea/indexLayout.xml b/.idea/.idea.PIX-Sicoob/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.PIX-Sicoob/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.PIX-Sicoob/.idea/vcs.xml b/.idea/.idea.PIX-Sicoob/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/.idea.PIX-Sicoob/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sicoob.Cobranca/Sicoob.Cobranca.csproj b/Sicoob.Cobranca/Sicoob.Cobranca.csproj index 3ffa868..ba89527 100644 --- a/Sicoob.Cobranca/Sicoob.Cobranca.csproj +++ b/Sicoob.Cobranca/Sicoob.Cobranca.csproj @@ -20,6 +20,7 @@ https://github.com/SharpSistemas/SicoobAPI README.md + True diff --git a/Sicoob.Conta/Sicoob.Conta.csproj b/Sicoob.Conta/Sicoob.Conta.csproj index 0ce4bb4..da56d61 100644 --- a/Sicoob.Conta/Sicoob.Conta.csproj +++ b/Sicoob.Conta/Sicoob.Conta.csproj @@ -19,6 +19,7 @@ README.md true $(NoWarn);1591 + True diff --git a/Sicoob.PIX/Sicoob.PIX.csproj b/Sicoob.PIX/Sicoob.PIX.csproj index 8d35f5e..157421b 100644 --- a/Sicoob.PIX/Sicoob.PIX.csproj +++ b/Sicoob.PIX/Sicoob.PIX.csproj @@ -22,6 +22,7 @@ README.md true $(NoWarn);1591 + True diff --git a/Sicoob.Shared/Sicoob.Shared.csproj b/Sicoob.Shared/Sicoob.Shared.csproj index 8d5a679..ffe433e 100644 --- a/Sicoob.Shared/Sicoob.Shared.csproj +++ b/Sicoob.Shared/Sicoob.Shared.csproj @@ -19,6 +19,7 @@ See examples and documentation on the GitHub page https://github.com/SharpSistemas/SicoobAPI + True From e6b5086b4e4b561510d78a4432eab6d0e57e1c19 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Wed, 28 Feb 2024 13:30:45 -0300 Subject: [PATCH 07/13] =?UTF-8?q?Alterar=20vers=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sicoob.Cobranca/Sicoob.Cobranca.csproj | 2 +- Sicoob.Conta/Sicoob.Conta.csproj | 2 +- Sicoob.PIX/Sicoob.PIX.csproj | 2 +- Sicoob.Shared/Sicoob.Shared.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Sicoob.Cobranca/Sicoob.Cobranca.csproj b/Sicoob.Cobranca/Sicoob.Cobranca.csproj index ba89527..d5c113c 100644 --- a/Sicoob.Cobranca/Sicoob.Cobranca.csproj +++ b/Sicoob.Cobranca/Sicoob.Cobranca.csproj @@ -5,7 +5,7 @@ 10.0 enable disable - 0.0.3-alpha + 0.0.4-alpha RafaelEstevam.Net SHARP SISTEMAS LTDA Sicoob Cobrança for C# diff --git a/Sicoob.Conta/Sicoob.Conta.csproj b/Sicoob.Conta/Sicoob.Conta.csproj index da56d61..7e373ca 100644 --- a/Sicoob.Conta/Sicoob.Conta.csproj +++ b/Sicoob.Conta/Sicoob.Conta.csproj @@ -5,7 +5,7 @@ 10.0 warnings disable - 0.9.2 + 0.9.3 RafaelEstevam.Net SHARP SISTEMAS LTDA Sicoob Conta for C# diff --git a/Sicoob.PIX/Sicoob.PIX.csproj b/Sicoob.PIX/Sicoob.PIX.csproj index 157421b..bf4f7fd 100644 --- a/Sicoob.PIX/Sicoob.PIX.csproj +++ b/Sicoob.PIX/Sicoob.PIX.csproj @@ -5,7 +5,7 @@ 10.0 warnings disable - 0.9.7.4 + 0.9.7.5 RafaelEstevam.Net SHARP SISTEMAS LTDA Sicoob PIX for C# diff --git a/Sicoob.Shared/Sicoob.Shared.csproj b/Sicoob.Shared/Sicoob.Shared.csproj index ffe433e..3ce85c9 100644 --- a/Sicoob.Shared/Sicoob.Shared.csproj +++ b/Sicoob.Shared/Sicoob.Shared.csproj @@ -5,7 +5,7 @@ 10.0 disable enable - 1.0.2 + 1.0.3 RafaelEstevam.Net SHARP SISTEMAS LTDA Base library for Sicoob APIs for C# From 91447a824dc8b2239835bc5cd78089f27b5d1a98 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Wed, 28 Feb 2024 14:39:35 -0300 Subject: [PATCH 08/13] =?UTF-8?q?Criar=20requisi=C3=A7=C3=A3o=20para=20Alt?= =?UTF-8?q?erar=20Data=20Vencimento=20do=20boleto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Models/AlterarDataVencimento.cs | 21 +++++++++++++++++++ Sicoob.Cobranca/Models/ProtestarBoleto.cs | 4 ++-- Sicoob.Cobranca/Sicoob.Cobranca.csproj | 2 +- Sicoob.Cobranca/SicoobCobranca.cs | 5 +++++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 Sicoob.Cobranca/Models/AlterarDataVencimento.cs diff --git a/Sicoob.Cobranca/Models/AlterarDataVencimento.cs b/Sicoob.Cobranca/Models/AlterarDataVencimento.cs new file mode 100644 index 0000000..9fed7cd --- /dev/null +++ b/Sicoob.Cobranca/Models/AlterarDataVencimento.cs @@ -0,0 +1,21 @@ +using System; +using Newtonsoft.Json; + +namespace Sicoob.Cobranca.Models; + +public class AlterarDataVencimentoRequest : BoletoBase +{ + [JsonConverter(typeof(CustomDateTimeConverter))] + public DateTime dataVencimento { get; set; } +} + +public class AlterarDataVencimentoResponse +{ + public DadosDataVencimento[]? resultado { get; set; } + public ResultadoInfo?[] mensagens { get; set; } +} +public class DadosDataVencimento +{ + public ResultadoInfo? status { get; set; } + public AlterarDataVencimentoRequest? boleto { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/ProtestarBoleto.cs b/Sicoob.Cobranca/Models/ProtestarBoleto.cs index 8c9a0ae..b858a07 100644 --- a/Sicoob.Cobranca/Models/ProtestarBoleto.cs +++ b/Sicoob.Cobranca/Models/ProtestarBoleto.cs @@ -10,8 +10,8 @@ public class ProtestarBoletoRequest: BoletoBase public class ProtestarBoletoResponse { - public DadosBaixa[]? resultado { get; set; } - public ResultadoInfo? mensagens { get; set; } + public DadosProtestar[]? resultado { get; set; } + public ResultadoInfo[]? mensagens { get; set; } } public class DadosProtestar { diff --git a/Sicoob.Cobranca/Sicoob.Cobranca.csproj b/Sicoob.Cobranca/Sicoob.Cobranca.csproj index d5c113c..86e646d 100644 --- a/Sicoob.Cobranca/Sicoob.Cobranca.csproj +++ b/Sicoob.Cobranca/Sicoob.Cobranca.csproj @@ -5,7 +5,7 @@ 10.0 enable disable - 0.0.4-alpha + 0.0.5-alpha RafaelEstevam.Net SHARP SISTEMAS LTDA Sicoob Cobrança for C# diff --git a/Sicoob.Cobranca/SicoobCobranca.cs b/Sicoob.Cobranca/SicoobCobranca.cs index 34f4c0a..bfa49a5 100644 --- a/Sicoob.Cobranca/SicoobCobranca.cs +++ b/Sicoob.Cobranca/SicoobCobranca.cs @@ -139,6 +139,11 @@ public async Task ConsultarBoletosPagador(string { return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/protestos", boletos)); } + + public async Task AlerarDataVencimento(AlterarDataVencimentoRequest[] boletos) + { + return await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/prorrogacoes/data-vencimento", boletos)); + } /* Movimentação */ public async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira.Tipo tipoMovimento, DateTime data) From 057feebdaca235bbeeffa9d00c30279b1d106216 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Wed, 28 Feb 2024 15:13:20 -0300 Subject: [PATCH 09/13] =?UTF-8?q?Alterar=20nome=20do=20m=C3=A9todo=20Alter?= =?UTF-8?q?arDataVencimento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sicoob.Cobranca/Sicoob.Cobranca.csproj | 2 +- Sicoob.Cobranca/SicoobCobranca.cs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Sicoob.Cobranca/Sicoob.Cobranca.csproj b/Sicoob.Cobranca/Sicoob.Cobranca.csproj index 86e646d..216c81a 100644 --- a/Sicoob.Cobranca/Sicoob.Cobranca.csproj +++ b/Sicoob.Cobranca/Sicoob.Cobranca.csproj @@ -5,7 +5,7 @@ 10.0 enable disable - 0.0.5-alpha + 0.0.6-alpha RafaelEstevam.Net SHARP SISTEMAS LTDA Sicoob Cobrança for C# diff --git a/Sicoob.Cobranca/SicoobCobranca.cs b/Sicoob.Cobranca/SicoobCobranca.cs index bfa49a5..06f4419 100644 --- a/Sicoob.Cobranca/SicoobCobranca.cs +++ b/Sicoob.Cobranca/SicoobCobranca.cs @@ -140,10 +140,10 @@ public async Task ConsultarBoletosPagador(string return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/protestos", boletos)); } - public async Task AlerarDataVencimento(AlterarDataVencimentoRequest[] boletos) - { - return await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/prorrogacoes/data-vencimento", boletos)); - } + public async Task AlterarDataVencimento(AlterarDataVencimentoRequest[] boletos) + { + return await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v2/boletos/prorrogacoes/data-vencimento", boletos)); + } /* Movimentação */ public async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira.Tipo tipoMovimento, DateTime data) From 5b92ff379a70d8238457bf767f57ab01a8ed7307 Mon Sep 17 00:00:00 2001 From: Lucas Moraes Date: Fri, 27 Sep 2024 14:51:44 -0300 Subject: [PATCH 10/13] =?UTF-8?q?Iniciar=20COnfigura=C3=A7=C3=A3o=20para?= =?UTF-8?q?=20API=20V3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....cs => CustomDateTimeWithZoneConverter.cs} | 10 +- Sicoob.Cobranca/Helpers.cs | 5 +- .../Models/Shared/Beneficiariofinal.cs | 7 + .../Models/{ => Shared}/DadosPagador.cs | 2 +- Sicoob.Cobranca/Models/{ => Shared}/Enum.cs | 13 +- .../Models/Shared/Listahistorico.cs | 10 + .../Models/Shared/Rateiocredito.cs | 18 ++ .../Shared/RetornoArquivoMovimentacao.cs | 7 + .../Shared/RetornoConsultaMovimentacoes.cs | 9 + ...RetornoSolicitacaoMovimentacoesCarteira.cs | 7 + .../Models/{ => v2}/AlterarDataVencimento.cs | 4 +- .../Models/{ => v2}/BaixarBoleto.cs | 2 +- Sicoob.Cobranca/Models/{ => v2}/BoletoBase.cs | 2 +- .../Models/{ => v2}/ConsultaBoleto.cs | 37 +-- .../Models/{ => v2}/IncluirBoletos.cs | 24 +- .../Models/{ => v2}/Movimentacoes.cs | 32 +-- .../Models/{ => v2}/ProtestarBoleto.cs | 2 +- .../Models/{ => v2}/ResultadoInfo.cs | 2 +- .../Models/v3/AlterarBoletoRequest.cs | 117 +++++++++ .../Models/v3/BaixarBoletoRequest.cs | 7 + .../Models/v3/ConsultaBoletoRequest.cs | 89 +++++++ Sicoob.Cobranca/Models/v3/IncluirBoleto.cs | 68 +++++ .../Models/v3/MovimentacaoRequest.cs | 14 ++ Sicoob.Cobranca/Models/v3/ProtestoRequest.cs | 7 + ...{SicoobCobranca.cs => SicoobCobrancaV2.cs} | 11 +- Sicoob.Cobranca/SicoobCobrancaV3.cs | 235 ++++++++++++++++++ Sicoob.Testes/TestesApiCobranca.cs | 9 +- 27 files changed, 655 insertions(+), 95 deletions(-) rename Sicoob.Cobranca/DataAnotation/{CustomDateTimeConverter.cs => CustomDateTimeWithZoneConverter.cs} (54%) create mode 100644 Sicoob.Cobranca/Models/Shared/Beneficiariofinal.cs rename Sicoob.Cobranca/Models/{ => Shared}/DadosPagador.cs (88%) rename Sicoob.Cobranca/Models/{ => Shared}/Enum.cs (88%) create mode 100644 Sicoob.Cobranca/Models/Shared/Listahistorico.cs create mode 100644 Sicoob.Cobranca/Models/Shared/Rateiocredito.cs create mode 100644 Sicoob.Cobranca/Models/Shared/RetornoArquivoMovimentacao.cs create mode 100644 Sicoob.Cobranca/Models/Shared/RetornoConsultaMovimentacoes.cs create mode 100644 Sicoob.Cobranca/Models/Shared/RetornoSolicitacaoMovimentacoesCarteira.cs rename Sicoob.Cobranca/Models/{ => v2}/AlterarDataVencimento.cs (82%) rename Sicoob.Cobranca/Models/{ => v2}/BaixarBoleto.cs (89%) rename Sicoob.Cobranca/Models/{ => v2}/BoletoBase.cs (88%) rename Sicoob.Cobranca/Models/{ => v2}/ConsultaBoleto.cs (75%) rename Sicoob.Cobranca/Models/{ => v2}/IncluirBoletos.cs (81%) rename Sicoob.Cobranca/Models/{ => v2}/Movimentacoes.cs (71%) rename Sicoob.Cobranca/Models/{ => v2}/ProtestarBoleto.cs (92%) rename Sicoob.Cobranca/Models/{ => v2}/ResultadoInfo.cs (75%) create mode 100644 Sicoob.Cobranca/Models/v3/AlterarBoletoRequest.cs create mode 100644 Sicoob.Cobranca/Models/v3/BaixarBoletoRequest.cs create mode 100644 Sicoob.Cobranca/Models/v3/ConsultaBoletoRequest.cs create mode 100644 Sicoob.Cobranca/Models/v3/IncluirBoleto.cs create mode 100644 Sicoob.Cobranca/Models/v3/MovimentacaoRequest.cs create mode 100644 Sicoob.Cobranca/Models/v3/ProtestoRequest.cs rename Sicoob.Cobranca/{SicoobCobranca.cs => SicoobCobrancaV2.cs} (95%) create mode 100644 Sicoob.Cobranca/SicoobCobrancaV3.cs diff --git a/Sicoob.Cobranca/DataAnotation/CustomDateTimeConverter.cs b/Sicoob.Cobranca/DataAnotation/CustomDateTimeWithZoneConverter.cs similarity index 54% rename from Sicoob.Cobranca/DataAnotation/CustomDateTimeConverter.cs rename to Sicoob.Cobranca/DataAnotation/CustomDateTimeWithZoneConverter.cs index aa84962..14f5fea 100644 --- a/Sicoob.Cobranca/DataAnotation/CustomDateTimeConverter.cs +++ b/Sicoob.Cobranca/DataAnotation/CustomDateTimeWithZoneConverter.cs @@ -1,9 +1,17 @@ using Newtonsoft.Json.Converters; +public class CustomDateTimeWithZoneConverter : IsoDateTimeConverter +{ + public CustomDateTimeWithZoneConverter() + { + DateTimeFormat = "yyyy-MM-ddTHH:mm:sszzz"; + } +} + public class CustomDateTimeConverter : IsoDateTimeConverter { public CustomDateTimeConverter() { - DateTimeFormat = "yyyy-MM-ddTHH:mm:sszzz"; + DateTimeFormat = "yyyy-MM-dd"; } } \ No newline at end of file diff --git a/Sicoob.Cobranca/Helpers.cs b/Sicoob.Cobranca/Helpers.cs index 2142b9e..4280a7b 100644 --- a/Sicoob.Cobranca/Helpers.cs +++ b/Sicoob.Cobranca/Helpers.cs @@ -1,6 +1,7 @@ -namespace Sicoob.Cobranca; +using Sicoob.Cobranca.Models.v2; + +namespace Sicoob.Cobranca; -using Sicoob.Cobranca.Models; using System; using System.Collections.Generic; using System.IO.Compression; diff --git a/Sicoob.Cobranca/Models/Shared/Beneficiariofinal.cs b/Sicoob.Cobranca/Models/Shared/Beneficiariofinal.cs new file mode 100644 index 0000000..7c9fe68 --- /dev/null +++ b/Sicoob.Cobranca/Models/Shared/Beneficiariofinal.cs @@ -0,0 +1,7 @@ +namespace Sicoob.Cobranca.Models.Shared; + +public class Beneficiariofinal +{ + public string? numeroCpfCnpj { get; set; } + public string? nome { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/DadosPagador.cs b/Sicoob.Cobranca/Models/Shared/DadosPagador.cs similarity index 88% rename from Sicoob.Cobranca/Models/DadosPagador.cs rename to Sicoob.Cobranca/Models/Shared/DadosPagador.cs index 9037938..310eafb 100644 --- a/Sicoob.Cobranca/Models/DadosPagador.cs +++ b/Sicoob.Cobranca/Models/Shared/DadosPagador.cs @@ -1,4 +1,4 @@ -namespace Sicoob.Cobranca.Models; +namespace Sicoob.Cobranca.Models.Shared; public class DadosPagador { diff --git a/Sicoob.Cobranca/Models/Enum.cs b/Sicoob.Cobranca/Models/Shared/Enum.cs similarity index 88% rename from Sicoob.Cobranca/Models/Enum.cs rename to Sicoob.Cobranca/Models/Shared/Enum.cs index d55bf38..baaa971 100644 --- a/Sicoob.Cobranca/Models/Enum.cs +++ b/Sicoob.Cobranca/Models/Shared/Enum.cs @@ -1,4 +1,4 @@ -namespace Sicoob.Cobranca.Models; +namespace Sicoob.Cobranca.Models.Shared; public enum IdentificacaoEmissaoBoleto: int @@ -81,4 +81,13 @@ public enum TipoHistorico : int Protesto = 5, LiquidacaoBaixa = 6 } - \ No newline at end of file + + public enum Tipo + { + Entrada = 1, + Prorrogacao = 2, + A_Vencer = 3, + Vencido = 4, + Liquidacao = 5, + Baixa = 6, + } \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/Shared/Listahistorico.cs b/Sicoob.Cobranca/Models/Shared/Listahistorico.cs new file mode 100644 index 0000000..75d3925 --- /dev/null +++ b/Sicoob.Cobranca/Models/Shared/Listahistorico.cs @@ -0,0 +1,10 @@ +using System; + +namespace Sicoob.Cobranca.Models.Shared; + +public class Listahistorico +{ + public DateTime? dataHistorico { get; set; } + public int? tipoHistorico { get; set; } + public string? descricaoHistorico { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/Shared/Rateiocredito.cs b/Sicoob.Cobranca/Models/Shared/Rateiocredito.cs new file mode 100644 index 0000000..292ec39 --- /dev/null +++ b/Sicoob.Cobranca/Models/Shared/Rateiocredito.cs @@ -0,0 +1,18 @@ +namespace Sicoob.Cobranca.Models.Shared; + +public class Rateiocredito +{ + public int numeroBanco { get; set; } + public int numeroAgencia { get; set; } + public int numeroContaCorrente { get; set; } + public bool contaPrincipal { get; set; } + public int codigoTipoValorRateio { get; set; } + public decimal valorRateio { get; set; } + public int codigoTipoCalculoRateio { get; set; } + public string? numeroCpfCnpjTitular { get; set; } + public string? nomeTitular { get; set; } + public int codigoFinalidadeTed { get; set; } + public string? codigoTipoContaDestinoTed { get; set; } + public int quantidadeDiasFloat { get; set; } + public string? dataFloatCredito { get; set; } +} diff --git a/Sicoob.Cobranca/Models/Shared/RetornoArquivoMovimentacao.cs b/Sicoob.Cobranca/Models/Shared/RetornoArquivoMovimentacao.cs new file mode 100644 index 0000000..2b590fd --- /dev/null +++ b/Sicoob.Cobranca/Models/Shared/RetornoArquivoMovimentacao.cs @@ -0,0 +1,7 @@ +namespace Sicoob.Cobranca.Models.Shared; + +public class RetornoArquivoMovimentacao +{ + public string arquivo { get; set; } + public string nomeArquivo { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/Shared/RetornoConsultaMovimentacoes.cs b/Sicoob.Cobranca/Models/Shared/RetornoConsultaMovimentacoes.cs new file mode 100644 index 0000000..062ba28 --- /dev/null +++ b/Sicoob.Cobranca/Models/Shared/RetornoConsultaMovimentacoes.cs @@ -0,0 +1,9 @@ +namespace Sicoob.Cobranca.Models.Shared; + +public class RetornoConsultaMovimentacoes +{ + public string quantidadeTotalRegistros { get; set; } + public int quantidadeRegistrosArquivo { get; set; } + public int quantidadeArquivo { get; set; } + public int[] idArquivos { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/Shared/RetornoSolicitacaoMovimentacoesCarteira.cs b/Sicoob.Cobranca/Models/Shared/RetornoSolicitacaoMovimentacoesCarteira.cs new file mode 100644 index 0000000..a442ae0 --- /dev/null +++ b/Sicoob.Cobranca/Models/Shared/RetornoSolicitacaoMovimentacoesCarteira.cs @@ -0,0 +1,7 @@ +namespace Sicoob.Cobranca.Models.Shared; + +public class RetornoSolicitacaoMovimentacoesCarteira +{ + public string mensagem { get; set; } + public int codigoSolicitacao { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/AlterarDataVencimento.cs b/Sicoob.Cobranca/Models/v2/AlterarDataVencimento.cs similarity index 82% rename from Sicoob.Cobranca/Models/AlterarDataVencimento.cs rename to Sicoob.Cobranca/Models/v2/AlterarDataVencimento.cs index 9fed7cd..73a61e8 100644 --- a/Sicoob.Cobranca/Models/AlterarDataVencimento.cs +++ b/Sicoob.Cobranca/Models/v2/AlterarDataVencimento.cs @@ -1,11 +1,11 @@ using System; using Newtonsoft.Json; -namespace Sicoob.Cobranca.Models; +namespace Sicoob.Cobranca.Models.v2; public class AlterarDataVencimentoRequest : BoletoBase { - [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonConverter(typeof(CustomDateTimeWithZoneConverter))] public DateTime dataVencimento { get; set; } } diff --git a/Sicoob.Cobranca/Models/BaixarBoleto.cs b/Sicoob.Cobranca/Models/v2/BaixarBoleto.cs similarity index 89% rename from Sicoob.Cobranca/Models/BaixarBoleto.cs rename to Sicoob.Cobranca/Models/v2/BaixarBoleto.cs index ef6b7c6..929e446 100644 --- a/Sicoob.Cobranca/Models/BaixarBoleto.cs +++ b/Sicoob.Cobranca/Models/v2/BaixarBoleto.cs @@ -1,4 +1,4 @@ -namespace Sicoob.Cobranca.Models; +namespace Sicoob.Cobranca.Models.v2; public class BaixarBoletoRequest : BoletoBase { diff --git a/Sicoob.Cobranca/Models/BoletoBase.cs b/Sicoob.Cobranca/Models/v2/BoletoBase.cs similarity index 88% rename from Sicoob.Cobranca/Models/BoletoBase.cs rename to Sicoob.Cobranca/Models/v2/BoletoBase.cs index 35bfb57..2daead3 100644 --- a/Sicoob.Cobranca/Models/BoletoBase.cs +++ b/Sicoob.Cobranca/Models/v2/BoletoBase.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Sicoob.Cobranca.Models; +namespace Sicoob.Cobranca.Models.v2; public abstract class BoletoBase { diff --git a/Sicoob.Cobranca/Models/ConsultaBoleto.cs b/Sicoob.Cobranca/Models/v2/ConsultaBoleto.cs similarity index 75% rename from Sicoob.Cobranca/Models/ConsultaBoleto.cs rename to Sicoob.Cobranca/Models/v2/ConsultaBoleto.cs index 8b981c9..4d0c952 100644 --- a/Sicoob.Cobranca/Models/ConsultaBoleto.cs +++ b/Sicoob.Cobranca/Models/v2/ConsultaBoleto.cs @@ -1,6 +1,7 @@ -namespace Sicoob.Cobranca.Models; +using System; +using Sicoob.Cobranca.Models.Shared; -using System; +namespace Sicoob.Cobranca.Models.v2; public class ConsultaBoletoRequest { @@ -81,38 +82,8 @@ public class DadosBoleto public string? qrCode { get; set; } } -public class Beneficiariofinal -{ - public string? numeroCpfCnpj { get; set; } - public string? nome { get; set; } -} - public class Mensagensinstrucao { public int tipoInstrucao { get; set; } public string[] mensagens { get; set; } -} - -public class Listahistorico -{ - public DateTime? dataHistorico { get; set; } - public int? tipoHistorico { get; set; } - public string? descricaoHistorico { get; set; } -} - -public class Rateiocredito -{ - public int numeroBanco { get; set; } - public int numeroAgencia { get; set; } - public int numeroContaCorrente { get; set; } - public bool contaPrincipal { get; set; } - public int codigoTipoValorRateio { get; set; } - public decimal valorRateio { get; set; } - public int codigoTipoCalculoRateio { get; set; } - public string? numeroCpfCnpjTitular { get; set; } - public string? nomeTitular { get; set; } - public int codigoFinalidadeTed { get; set; } - public string? codigoTipoContaDestinoTed { get; set; } - public int quantidadeDiasFloat { get; set; } - public string? dataFloatCredito { get; set; } -} +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/IncluirBoletos.cs b/Sicoob.Cobranca/Models/v2/IncluirBoletos.cs similarity index 81% rename from Sicoob.Cobranca/Models/IncluirBoletos.cs rename to Sicoob.Cobranca/Models/v2/IncluirBoletos.cs index 5c1b596..f5a4495 100644 --- a/Sicoob.Cobranca/Models/IncluirBoletos.cs +++ b/Sicoob.Cobranca/Models/v2/IncluirBoletos.cs @@ -1,15 +1,15 @@ -using Newtonsoft.Json; +using System; +using Newtonsoft.Json; +using Sicoob.Cobranca.Models.Shared; -namespace Sicoob.Cobranca.Models; - -using System; +namespace Sicoob.Cobranca.Models.v2; public class IncluirBoletosRequest : BoletoBase { public int numeroContaCorrente { get; set; } public string especieDocumento { get; set; } = "DM"; // Duplicata Mercantil, ver lista - [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonConverter(typeof(CustomDateTimeWithZoneConverter))] public DateTime dataEmissao { get; set; } public string seuNumero { get; set; } [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] @@ -17,31 +17,31 @@ public class IncluirBoletosRequest : BoletoBase public int identificacaoEmissaoBoleto { get; set; } public int identificacaoDistribuicaoBoleto { get; set; } public decimal valor { get; set; } - [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonConverter(typeof(CustomDateTimeWithZoneConverter))] public DateTime dataVencimento { get; set; } - [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonConverter(typeof(CustomDateTimeWithZoneConverter))] [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public DateTime? dataLimitePagamento { get; set; } public int valorAbatimento { get; set; } public int tipoDesconto { get; set; } - [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonConverter(typeof(CustomDateTimeWithZoneConverter))] [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public DateTime? dataPrimeiroDesconto { get; set; } public decimal valorPrimeiroDesconto { get; set; } - [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonConverter(typeof(CustomDateTimeWithZoneConverter))] [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public DateTime? dataSegundoDesconto { get; set; } public decimal valorSegundoDesconto { get; set; } - [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonConverter(typeof(CustomDateTimeWithZoneConverter))] [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public DateTime? dataTerceiroDesconto { get; set; } public decimal valorTerceiroDesconto { get; set; } public int tipoMulta { get; set; } - [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonConverter(typeof(CustomDateTimeWithZoneConverter))] public DateTime dataMulta { get; set; } public decimal valorMulta { get; set; } public int tipoJurosMora { get; set; } - [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonConverter(typeof(CustomDateTimeWithZoneConverter))] public DateTime dataJurosMora { get; set; } public decimal valorJurosMora { get; set; } public int numeroParcela { get; set; } diff --git a/Sicoob.Cobranca/Models/Movimentacoes.cs b/Sicoob.Cobranca/Models/v2/Movimentacoes.cs similarity index 71% rename from Sicoob.Cobranca/Models/Movimentacoes.cs rename to Sicoob.Cobranca/Models/v2/Movimentacoes.cs index 37a8dfc..cafb192 100644 --- a/Sicoob.Cobranca/Models/Movimentacoes.cs +++ b/Sicoob.Cobranca/Models/v2/Movimentacoes.cs @@ -1,19 +1,9 @@ -namespace Sicoob.Cobranca.Models; +using System; -using System; +namespace Sicoob.Cobranca.Models.v2; public class SolicitacaoMovimentacoesCarteira { - public enum Tipo - { - Entrada = 1, - Prorrogacao = 2, - A_Vencer = 3, - Vencido = 4, - Liquidacao = 5, - Baixa = 6, - } - public int numeroContrato { get; set; } /// /// 1. Entrada 2. Prorrogação 3. A Vencer 4. Vencido 5. Liquidação 6. Baixa @@ -27,23 +17,7 @@ public class ResponseMovimentacao { public T resultado { get; set; } } -public class RetornoSolicitacaoMovimentacoesCarteira -{ - public string mensagem { get; set; } - public int codigoSolicitacao { get; set; } -} -public class RetornoConsultaMovimentacoes -{ - public string quantidadeTotalRegistros { get; set; } - public int quantidadeRegistrosArquivo { get; set; } - public int quantidadeArquivo { get; set; } - public int[] idArquivos { get; set; } -} -public class RetornoArquivoMovimentacao -{ - public string arquivo { get; set; } - public string nomeArquivo { get; set; } -} + public class MovimentacoesArquivos { public int codigoSolicitacao { get; set; } diff --git a/Sicoob.Cobranca/Models/ProtestarBoleto.cs b/Sicoob.Cobranca/Models/v2/ProtestarBoleto.cs similarity index 92% rename from Sicoob.Cobranca/Models/ProtestarBoleto.cs rename to Sicoob.Cobranca/Models/v2/ProtestarBoleto.cs index b858a07..9d29698 100644 --- a/Sicoob.Cobranca/Models/ProtestarBoleto.cs +++ b/Sicoob.Cobranca/Models/v2/ProtestarBoleto.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Sicoob.Cobranca.Models; +namespace Sicoob.Cobranca.Models.v2; public class ProtestarBoletoRequest: BoletoBase { diff --git a/Sicoob.Cobranca/Models/ResultadoInfo.cs b/Sicoob.Cobranca/Models/v2/ResultadoInfo.cs similarity index 75% rename from Sicoob.Cobranca/Models/ResultadoInfo.cs rename to Sicoob.Cobranca/Models/v2/ResultadoInfo.cs index 157baeb..fbba67d 100644 --- a/Sicoob.Cobranca/Models/ResultadoInfo.cs +++ b/Sicoob.Cobranca/Models/v2/ResultadoInfo.cs @@ -1,4 +1,4 @@ -namespace Sicoob.Cobranca.Models; +namespace Sicoob.Cobranca.Models.v2; public class ResultadoInfo { diff --git a/Sicoob.Cobranca/Models/v3/AlterarBoletoRequest.cs b/Sicoob.Cobranca/Models/v3/AlterarBoletoRequest.cs new file mode 100644 index 0000000..c754896 --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/AlterarBoletoRequest.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Sicoob.Cobranca.Models.v3; + +public class AlterarBoletoRequest +{ + public long numeroCliente { get; set; } + public int codigoModalidade { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public EspecieDocumento? especieDocumento { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public SeuNumero? seuNumero { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public Desconto? desconto { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public Abatimento? abatimento { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public Multa? multa { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public JurosMora? jurosMora { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public RateioCredito? rateioCredito { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public Pix? pix { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public ProrrogacaoVencimento? prorrogacaoVencimento { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public ProrrogacaoLimitePagamento? prorrogacaoLimitePagamento { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public ValorNominal? valorNominal { get; set; } +} + +public class EspecieDocumento +{ + public string codigoEspecieDocumento { get; set; } +} + +public class SeuNumero +{ + public string seuNumero { get; set; } + public string identificacaoBoletoEmpresa { get; set; } +} + +public class Desconto +{ + public int tipoDesconto { get; set; } + public DateTime dataPrimeiroDesconto { get; set; } + public decimal valorPrimeiroDesconto { get; set; } + public DateTime? dataSegundoDesconto { get; set; } + public decimal? valorSegundoDesconto { get; set; } + public DateTime? dataTerceiroDesconto { get; set; } + public decimal? valorTerceiroDesconto { get; set; } +} + +public class Abatimento +{ + public decimal valorAbatimento { get; set; } +} + +public class Multa +{ + public int tipoMulta { get; set; } + public DateTime dataMulta { get; set; } + public decimal valorMulta { get; set; } +} + +public class JurosMora +{ + public int tipoJurosMora { get; set; } + public DateTime dataJurosMora { get; set; } + public decimal valorJurosMora { get; set; } +} + +public class RateioCredito +{ + public int tipoOperacao { get; set; } + public List rateioCreditos { get; set; } +} + +public class RateioCreditoDetalhe +{ + public int numeroBanco { get; set; } + public int numeroAgencia { get; set; } + public int numeroContaCorrente { get; set; } + public bool contaPrincipal { get; set; } + public int codigoTipoValorRateio { get; set; } + public decimal valorRateio { get; set; } + public int codigoTipoCalculoRateio { get; set; } + public string numeroCpfCnpjTitular { get; set; } + public string nomeTitular { get; set; } + public int codigoFinalidadeTed { get; set; } + public string codigoTipoContaDestinoTed { get; set; } + public int quantidadeDiasFloat { get; set; } + public DateTime dataFloatCredito { get; set; } +} + +public class Pix +{ + public bool utilizarPix { get; set; } +} + +public class ProrrogacaoVencimento +{ + public DateTime dataVencimento { get; set; } +} + +public class ProrrogacaoLimitePagamento +{ + public DateTime dataLimitePagamento { get; set; } +} + +public class ValorNominal +{ + public decimal valor { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/v3/BaixarBoletoRequest.cs b/Sicoob.Cobranca/Models/v3/BaixarBoletoRequest.cs new file mode 100644 index 0000000..1bd1cb6 --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/BaixarBoletoRequest.cs @@ -0,0 +1,7 @@ +namespace Sicoob.Cobranca.Models.v3; + +public class BaixarBoletoRequest +{ + public long numeroCliente { get; set; } + public int codigoModalidade { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/v3/ConsultaBoletoRequest.cs b/Sicoob.Cobranca/Models/v3/ConsultaBoletoRequest.cs new file mode 100644 index 0000000..41c8d95 --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/ConsultaBoletoRequest.cs @@ -0,0 +1,89 @@ +using System; +using Sicoob.Cobranca.Models.Shared; +using Sicoob.Cobranca.Models.v2; + +namespace Sicoob.Cobranca.Models.v3; + +public class ConsultaBoletoRequest +{ + public int numeroCliente { get; set; } + public int codigoModalidade { get; set; } = 1; // Só tem a opção de `1` + public int? nossoNumero { get; set; } + public string? linhaDigitavel { get; set; } + public string? codigoBarras { get; set; } + public bool? gerarPdf { get; set; } +} + +public class ConsultaBoletoPagadorRequest +{ + public int numeroCliente { get; set; } + /// + /// 1: Em Aberto + /// 2: Baixado + /// 3: Liquidado + /// + public int? codigoSituação { get; set; } + + public string? dataInicio { get; set; } + public string? dataFim { get; set; } +} + +public class IncluirBoletosResponse +{ + public DadosBoleto? resultado { get; set; } +} + +public class ConsultaBoletoResponse +{ + public DadosBoleto? resultado { get; set; } +} + +public class ConsultaBoletosPagadorResponse +{ + public DadosBoleto[]? resultado { get; set; } +} + +public class DadosBoleto +{ + public int numeroCliente { get; set; } + public int codigoModalidade { get; set; } + public int numeroContaCorrente { get; set; } + public string? especieDocumento { get; set; } + public DateTime dataEmissao { get; set; } + public int nossoNumero { get; set; } + public string? seuNumero { get; set; } + public string? identificacaoBoletoEmpresa { get; set; } + public string? codigoBarras { get; set; } + public string? linhaDigitavel { get; set; } + public decimal valor { get; set; } + public DateTime dataVencimento { get; set; } + public DateTime dataLimitePagamento { get; set; } + public decimal valorAbatimento { get; set; } + public int tipoDesconto { get; set; } + public DateTime dataPrimeiroDesconto { get; set; } + public decimal valorPrimeiroDesconto { get; set; } + public DateTime dataSegundoDesconto { get; set; } + public decimal valorSegundoDesconto { get; set; } + public DateTime dataTerceiroDesconto { get; set; } + public decimal valorTerceiroDesconto { get; set; } + public int tipoMulta { get; set; } + public DateTime dataMulta { get; set; } + public decimal valorMulta { get; set; } + public int tipoJurosMora { get; set; } + public DateTime dataJurosMora { get; set; } + public decimal valorJurosMora { get; set; } + public int numeroParcela { get; set; } + public bool aceite { get; set; } + public int codigoNegativacao { get; set; } + public int codigoProtesto { get; set; } + public int numeroDiasProtesto { get; set; } + public int quantidadeDiasFloat { get; set; } + public DadosPagador? pagador { get; set; } + public Beneficiariofinal? beneficiarioFinal { get; set; } + public string[]? mensagensInstrucao { get; set; } + public Listahistorico[]? listaHistorico { get; set; } + public string? situacaoBoleto { get; set; } + public Rateiocredito[]? rateioCreditos { get; set; } + public string? pdfBoleto { get; set; } + public string? qrCode { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/v3/IncluirBoleto.cs b/Sicoob.Cobranca/Models/v3/IncluirBoleto.cs new file mode 100644 index 0000000..3ab5805 --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/IncluirBoleto.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Sicoob.Cobranca.Models.Shared; + +namespace Sicoob.Cobranca.Models.v3; + +public class IncluirBoletoRequest +{ + public long numeroCliente { get; set; } + public int codigoModalidade { get; set; } + public int numeroContaCorrente { get; set; } + public string codigoEspecieDocumento { get; set; } = "DM"; // Duplicata Mercantil, ver lista + [JsonConverter(typeof(CustomDateTimeConverter))] + public DateTime? dataEmissao { get; set; } + public long nossoNumero { get; set; } + public string seuNumero { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public string? identificacaoBoletoEmpresa { get; set; } + public int identificacaoEmissaoBoleto { get; set; } + public int identificacaoDistribuicaoBoleto { get; set; } + public decimal valor { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + public DateTime dataVencimento { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public DateTime? dataLimitePagamento { get; set; } + public decimal valorAbatimento { get; set; } + public int tipoDesconto { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public DateTime dataPrimeiroDesconto { get; set; } + public decimal valorPrimeiroDesconto { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public DateTime dataSegundoDesconto { get; set; } + public decimal valorSegundoDesconto { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public DateTime dataTerceiroDesconto { get; set; } + public decimal valorTerceiroDesconto { get; set; } + public int tipoMulta { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + public DateTime dataMulta { get; set; } + public decimal valorMulta { get; set; } + public int tipoJurosMora { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] + public DateTime dataJurosMora { get; set; } + public decimal valorJurosMora { get; set; } + public int numeroParcela { get; set; } + public bool aceite { get; set; } + public int codigoNegativacao { get; set; } + public int numeroDiasNegativacao { get; set; } + public int codigoProtesto { get; set; } + public int numeroDiasProtesto { get; set; } + public DadosPagador pagador { get; set; } + public Beneficiariofinal beneficiarioFinal { get; set; } + public string[] mensagensInstrucao { get; set; } + public bool gerarPdf { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public Rateiocredito[] rateioCreditos { get; set; } + /// + /// 0: Padrão, 1: Com PIX, 2: Sem PIX + /// + public int codigoCadastrarPIX { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public int? numeroContratoCobranca { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/v3/MovimentacaoRequest.cs b/Sicoob.Cobranca/Models/v3/MovimentacaoRequest.cs new file mode 100644 index 0000000..74e82c4 --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/MovimentacaoRequest.cs @@ -0,0 +1,14 @@ +using System; + +namespace Sicoob.Cobranca.Models.v3; + +public class MovimentacaoRequest +{ + public int numeroCliente { get; set; } + /// + /// 1. Entrada 2. Prorrogação 3. A Vencer 4. Vencido 5. Liquidação 6. Baixa + /// + public int tipoMovimento { get; set; } + public DateTime dataInicial { get; set; } + public DateTime dataFinal { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/v3/ProtestoRequest.cs b/Sicoob.Cobranca/Models/v3/ProtestoRequest.cs new file mode 100644 index 0000000..c84d7a5 --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/ProtestoRequest.cs @@ -0,0 +1,7 @@ +namespace Sicoob.Cobranca.Models.v3; + +public class ProtestoRequest +{ + public long numeroCliente { get; set; } + public int codigoModalidade { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/SicoobCobranca.cs b/Sicoob.Cobranca/SicoobCobrancaV2.cs similarity index 95% rename from Sicoob.Cobranca/SicoobCobranca.cs rename to Sicoob.Cobranca/SicoobCobrancaV2.cs index 06f4419..256e9bc 100644 --- a/Sicoob.Cobranca/SicoobCobranca.cs +++ b/Sicoob.Cobranca/SicoobCobrancaV2.cs @@ -4,11 +4,12 @@ * gh/SharpSistemas/SicoobAPI * \**************************************/ +using Sicoob.Cobranca.Models.Shared; +using Sicoob.Cobranca.Models.v2; using Sicoob.Shared.Models; namespace Sicoob.Cobranca; -using Sicoob.Cobranca.Models; using Sicoob.Shared.Models.Acesso; using Sicoob.Shared.Models.Geral; using Simple.API; @@ -22,7 +23,7 @@ namespace Sicoob.Cobranca; /// /// Classe para comunicação com as APIs de Cobrança do Sicoob /// -public sealed class SicoobCobranca : Shared.Sicoob +public sealed class SicoobCobrancaV2 : Shared.Sicoob { // Documentações // > APIs tipo "Swagger": @@ -37,7 +38,7 @@ public sealed class SicoobCobranca : Shared.Sicoob public delegate void UpdateToken(ConfiguracaoToken token); public event UpdateToken UpdateTokenEvent; - public SicoobCobranca(Shared.Models.ConfiguracaoAPI configApi, int NumeroContrato, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) + public SicoobCobrancaV2(Shared.Models.ConfiguracaoAPI configApi, int NumeroContrato, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) : base(configApi, certificado) { numeroContrato = NumeroContrato; @@ -146,13 +147,13 @@ public async Task ConsultarBoletosPagador(string } /* Movimentação */ - public async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira.Tipo tipoMovimento, DateTime data) + public async Task SolicitarMovimentacao(Tipo tipoMovimento, DateTime data) { var di = data.Date; var df = data.Date.AddDays(1).AddSeconds(-1); return await SolicitarMovimentacao(tipoMovimento, di, df); } - public async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira.Tipo tipoMovimento, DateTime dataInicial, DateTime dataFinal) + public async Task SolicitarMovimentacao(Tipo tipoMovimento, DateTime dataInicial, DateTime dataFinal) => await SolicitarMovimentacao(new SolicitacaoMovimentacoesCarteira() { numeroContrato = numeroContrato, tipoMovimento = (int)tipoMovimento, dataInicial = dataInicial, dataFinal = dataFinal }); private async Task SolicitarMovimentacao(SolicitacaoMovimentacoesCarteira solicitacao) { diff --git a/Sicoob.Cobranca/SicoobCobrancaV3.cs b/Sicoob.Cobranca/SicoobCobrancaV3.cs new file mode 100644 index 0000000..b35b87e --- /dev/null +++ b/Sicoob.Cobranca/SicoobCobrancaV3.cs @@ -0,0 +1,235 @@ +/**************************************\ + * Biblioteca C# para APIs do SICOOB * + * Autor: Rafael Estevam * + * gh/SharpSistemas/SicoobAPI * +\**************************************/ + +using Sicoob.Cobranca.Models.Shared; +using Sicoob.Cobranca.Models.v2; +using Sicoob.Cobranca.Models.v3; +using Sicoob.Shared.Models; +using BaixarBoletoRequest = Sicoob.Cobranca.Models.v3.BaixarBoletoRequest; +using ConsultaBoletoRequest = Sicoob.Cobranca.Models.v3.ConsultaBoletoRequest; +using ConsultaBoletoResponse = Sicoob.Cobranca.Models.v3.ConsultaBoletoResponse; +using ConsultaBoletosPagadorResponse = Sicoob.Cobranca.Models.v3.ConsultaBoletosPagadorResponse; +using IncluirBoletosResponse = Sicoob.Cobranca.Models.v3.IncluirBoletosResponse; + +namespace Sicoob.Cobranca; + +using Sicoob.Shared.Models.Acesso; +using Sicoob.Shared.Models.Geral; +using Simple.API; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; + +/// +/// Classe para comunicação com as APIs de Cobrança do Sicoob +/// +public sealed class SicoobCobrancaV3 : Shared.Sicoob +{ + // Documentações + // > APIs tipo "Swagger": + // https://developers.sicoob.com.br/#!/apis + // > Link que o Suporte do Sicoob enviou + // https://documenter.getpostman.com/view/20565799/Uzs6yNhe#6447c293-f67b-44ba-b7be-41f5c3de978d + + private readonly int numeroContrato; + private ClientInfo clientApi; + private Shared.Models.ConfiguracaoAPI ConfigApi { get; } + public string? PastaCopiaMovimentacoes { get; set; } + public delegate void UpdateToken(ConfiguracaoToken token); + public event UpdateToken? UpdateTokenEvent; + + public SicoobCobrancaV3(ConfiguracaoAPI configApi, int nroContrato, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) + : base(configApi, certificado) + { + numeroContrato = nroContrato; + ConfigApi = configApi; + clientApi = new ClientInfo(ConfigApi.UrlApi); + } + + protected override void setupClients(HttpClientHandler handler) + { + clientApi = new ClientInfo(ConfigApi.UrlApi, handler); + clientApi.SetHeader("client_id", ConfigApi.ClientId); + + if (ConfigApi.Token is not null) + clientApi.SetAuthorizationBearer(ConfigApi.Token.Token); + } + protected override void atualizaClients(TokenResponse token) + { + ConfigApi.Token = new ConfiguracaoToken() + { + ExpiresAtUTC = DateTime.UtcNow.AddSeconds(token.expires_in), + Token = token.access_token + }; + //Notificar quando o token foi atualizado + if (UpdateTokenEvent is not null) + UpdateTokenEvent(ConfigApi.Token); + + clientApi.SetAuthorizationBearer(token.access_token); + } + + /* Boletos */ + + /// + /// Consulta boleto utilizando um dos três métodos de busca + /// + /// + /// Número identificador do boleto no Sisbr. Caso seja infomado, não é necessário infomar a linha digitável ou código de barras + /// Número da linha digitável do boleto com 47 posições. Caso seja informado, não é necessário informar o nosso número ou código de barras + /// Número de código de barras do boleto com 44 posições.Caso seja informado, não é necessário informar o nosso número ou linha digitável + /// Boleto buscado + public async Task ConsultarBoleto(int? nossoNumero = null, string? linhaDigitavel = null, string? codigoBarras = null, int modalidade = (int)Modalidade.SimplesComRegistro) + { + var consulta = new ConsultaBoletoRequest() + { + codigoModalidade = modalidade, + numeroCliente = numeroContrato, + nossoNumero = nossoNumero, + linhaDigitavel = linhaDigitavel, + codigoBarras = codigoBarras + }; + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos", consulta)); + } + + /// + /// Consulta boletos de um Pagador + /// + /// CPF/CNPJ do Pagador + /// Código da Situação do Boleto. 1: Em aberto, 2: Baixado, 3: Liquidado + /// Data de Vencimento Inicial + /// Data de Vencimento Final + /// Boletos do Pagador + public async Task ConsultarBoletosPagador(string numeroCpfCnpj, int? codigoSituacao = null, DateTime? dataVencimentoInicio = null, DateTime? dataVencimentoFim = null) + { + var consulta = new ConsultaBoletoPagadorRequest() + { + numeroCliente = numeroContrato, + codigoSituação = codigoSituacao, + dataInicio = dataVencimentoInicio?.ToString("yyyy-MM-dd"), + dataFim = dataVencimentoFim?.ToString("yyyy-MM-dd") + }; + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos/pagadores/" + numeroCpfCnpj, consulta)); + } + + public async Task ConsultarSegundaViaBoleto(int modalidade, int? nossoNumero = null, string? linhaDigitavel = null, string? codigoBarras = null, bool gerarPdf = false) + { + var consulta = new ConsultaBoletoRequest() + { + codigoModalidade = modalidade, + numeroCliente = numeroContrato, + nossoNumero = nossoNumero, + linhaDigitavel = linhaDigitavel, + codigoBarras = codigoBarras, + gerarPdf = gerarPdf + }; + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos/segunda-via", consulta)); + } + + public async Task IncluirBoletos(IncluirBoletoRequest boleto) + { + return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos", boleto)); + } + + public async Task BaixarBoletos(int nossoNumero, int codigoModalidade) + { + var baixa = new BaixarBoletoRequest + { + numeroCliente = numeroContrato, + codigoModalidade = codigoModalidade + }; + await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/baixar", baixa)); + } + + public async Task ProtestarBoletos(int nossoNumero, int codigoModalidade) + { + var protesto = new ProtestoRequest + { + numeroCliente = numeroContrato, + codigoModalidade = codigoModalidade, + }; + await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/protestos", protesto)); + } + + public async Task AlterarBoleto(int nossoNumero, AlterarBoletoRequest boletos) + { + await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos/" + nossoNumero, boletos)); + } + + /* Movimentação */ + public async Task SolicitarMovimentacao(Tipo tipoMovimento, DateTime data) + { + var di = data.Date; + var df = data.Date.AddDays(1).AddSeconds(-1); + return await SolicitarMovimentacao(tipoMovimento, di, df); + } + public async Task SolicitarMovimentacao(Tipo tipoMovimento, DateTime dataInicial, DateTime dataFinal) + => await SolicitarMovimentacao(new MovimentacaoRequest() { numeroCliente = numeroContrato, tipoMovimento = (int)tipoMovimento, dataInicial = dataInicial, dataFinal = dataFinal }); + private async Task SolicitarMovimentacao(MovimentacaoRequest movimentacao) + { + var retorno = await ExecutaChamadaAsync(() => clientApi.PostAsync>(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos/movimentacoes", movimentacao)); + return retorno.resultado; + } + public async Task ConsultarSituacaoSolicitacao(int codigoSolicitacao) + { + await VerificaAtualizaCredenciaisAsync(); + var result = await clientApi.GetAsync>( ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos/solicitacoes/movimentacao", new { numeroCliente = numeroContrato, codigoSolicitacao }); + + if (result.IsSuccessStatusCode) return result.Data.resultado; + + // "{\"mensagens\":[{\"mensagem\":\"Solicitação ainda em processamento.\",\"codigo\":\"5004\"}]}" + if (result.TryParseErrorResponseData(out ErroRequisicao err)) + { + if (err.mensagens == null) { } + + if (err.mensagens.Any(o => o.codigo == 5004)) return null; + + throw new ErroRequisicaoException(err); + } + result.EnsureSuccessStatusCode(); // Erro comum + return null; // a linha de cima vai arremessar o erro padrão + } + + private async Task DownloadArquivoMovimentacao(int codigoSolicitacao, int idArquivo) + { + var retorno = await ExecutaChamadaAsync(() => clientApi.GetAsync>(ConfigApi.UrlApi + "/cobranca-bancaria/v3/boletos/movimentacoes/download", new { numeroCliente = numeroContrato, codigoSolicitacao, idArquivo })); + return retorno.resultado; + } + public async Task BaixarMovimentacoes(int codigoSolicitacao, int[] arquivos) + { + var lst = new List(); + foreach (var idArquivo in arquivos) + { + var retorno = await DownloadArquivoMovimentacao(codigoSolicitacao, idArquivo); + + var bytesZip = Convert.FromBase64String(retorno.arquivo); + SalvarCopiaMovimentacao(bytesZip, retorno.nomeArquivo); + + var registros = Helpers.ProcessarArquivoMovimentacao(bytesZip); + lst.Add(new MovimentacoesArquivos + { + codigoSolicitacao = codigoSolicitacao, + idArquivo = idArquivo, + nomeArquivo = retorno.nomeArquivo, + Movimentacoes = registros.ToArray(), + }); + } + return lst.ToArray(); + } + + private void SalvarCopiaMovimentacao(byte[] bytesZip, string nomeArquivo) + { + if (PastaCopiaMovimentacoes == null) return; + if (!Directory.Exists(PastaCopiaMovimentacoes)) Directory.CreateDirectory(PastaCopiaMovimentacoes); + + var path = Path.Combine(PastaCopiaMovimentacoes, nomeArquivo); + if (File.Exists(path)) return; + + File.WriteAllBytes(path, bytesZip); + } +} diff --git a/Sicoob.Testes/TestesApiCobranca.cs b/Sicoob.Testes/TestesApiCobranca.cs index fe7ef5c..29d4538 100644 --- a/Sicoob.Testes/TestesApiCobranca.cs +++ b/Sicoob.Testes/TestesApiCobranca.cs @@ -4,7 +4,8 @@ * gh/SharpSistemas/SicoobAPI * \**************************************/ -using Sicoob.Cobranca.Models; +using Sicoob.Cobranca.Models.Shared; +using Sicoob.Cobranca.Models.v2; namespace Sicoob.Testes; @@ -25,7 +26,7 @@ internal static async Task Run_Cobranca() //cfg.Scope.Cobranca_Setar(true); //File.WriteAllText("config_Cob.json", JsonConvert.SerializeObject(cfg)); - var cobranca = new SicoobCobranca(cfg, NumeroContrato: 000); + var cobranca = new SicoobCobrancaV2(cfg, NumeroContrato: 000); await cobranca.SetupAsync(); /*var boleto = await cobranca.IncluirBoletos(new [] @@ -121,10 +122,10 @@ internal static async Task Run_Cobranca() //var consulta = await cobranca.ConsultarBoletosPagador(numeroCpfCnpj: "00000000000000"); //var segVia = await cobranca.ConsultarSegundaViaBoleto(1, nossoNumero: 0, gerarPdf: true); - var p1 = await cobranca.SolicitarMovimentacao(Cobranca.Models.SolicitacaoMovimentacoesCarteira.Tipo.Liquidacao, new DateTime(2024, 02, 20), new DateTime(2024, 02, 23)); + var p1 = await cobranca.SolicitarMovimentacao(Tipo.Liquidacao, new DateTime(2024, 02, 20), new DateTime(2024, 02, 23)); int codigo = p1.codigoSolicitacao; - Cobranca.Models.RetornoConsultaMovimentacoes? p2 = null; + RetornoConsultaMovimentacoes? p2 = null; while (p2 == null) { Console.WriteLine("Consultando ..."); From 599861c6e8627b6c9f6c716034b4ced7d3b464d1 Mon Sep 17 00:00:00 2001 From: Rafael Estevam Date: Thu, 3 Oct 2024 08:35:49 -0300 Subject: [PATCH 11/13] Remove .idea --- .idea/.idea.PIX-Sicoob/.idea/.gitignore | 13 ------------- .idea/.idea.PIX-Sicoob/.idea/.name | 1 - .idea/.idea.PIX-Sicoob/.idea/encodings.xml | 4 ---- .idea/.idea.PIX-Sicoob/.idea/indexLayout.xml | 8 -------- .idea/.idea.PIX-Sicoob/.idea/vcs.xml | 6 ------ 5 files changed, 32 deletions(-) delete mode 100644 .idea/.idea.PIX-Sicoob/.idea/.gitignore delete mode 100644 .idea/.idea.PIX-Sicoob/.idea/.name delete mode 100644 .idea/.idea.PIX-Sicoob/.idea/encodings.xml delete mode 100644 .idea/.idea.PIX-Sicoob/.idea/indexLayout.xml delete mode 100644 .idea/.idea.PIX-Sicoob/.idea/vcs.xml diff --git a/.idea/.idea.PIX-Sicoob/.idea/.gitignore b/.idea/.idea.PIX-Sicoob/.idea/.gitignore deleted file mode 100644 index dea62f2..0000000 --- a/.idea/.idea.PIX-Sicoob/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/modules.xml -/projectSettingsUpdater.xml -/.idea.PIX-Sicoob.iml -/contentModel.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.idea.PIX-Sicoob/.idea/.name b/.idea/.idea.PIX-Sicoob/.idea/.name deleted file mode 100644 index b9059a6..0000000 --- a/.idea/.idea.PIX-Sicoob/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -PIX-Sicoob \ No newline at end of file diff --git a/.idea/.idea.PIX-Sicoob/.idea/encodings.xml b/.idea/.idea.PIX-Sicoob/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/.idea/.idea.PIX-Sicoob/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/.idea.PIX-Sicoob/.idea/indexLayout.xml b/.idea/.idea.PIX-Sicoob/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/.idea/.idea.PIX-Sicoob/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.PIX-Sicoob/.idea/vcs.xml b/.idea/.idea.PIX-Sicoob/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/.idea.PIX-Sicoob/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 2a4c8856054a06319287ca950e770e8ea57211ca Mon Sep 17 00:00:00 2001 From: Rafael Estevam Date: Thu, 3 Oct 2024 08:36:15 -0300 Subject: [PATCH 12/13] Adiciona ao gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index dfcfd56..f5b4c14 100644 --- a/.gitignore +++ b/.gitignore @@ -348,3 +348,5 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ + +.idea/ From 42cd1e8ed63afb17c917348348dc3508bb5cf1b6 Mon Sep 17 00:00:00 2001 From: Rafael Estevam Date: Thu, 3 Oct 2024 08:38:03 -0300 Subject: [PATCH 13/13] Revert "Criar pacotes ao buildar o projeto" This reverts commit a879437905c20210fa1e41171f49b9eebd753bf5. --- Sicoob.Cobranca/Sicoob.Cobranca.csproj | 1 - Sicoob.Conta/Sicoob.Conta.csproj | 1 - Sicoob.PIX/Sicoob.PIX.csproj | 1 - Sicoob.Shared/Sicoob.Shared.csproj | 1 - 4 files changed, 4 deletions(-) diff --git a/Sicoob.Cobranca/Sicoob.Cobranca.csproj b/Sicoob.Cobranca/Sicoob.Cobranca.csproj index 216c81a..0d792cb 100644 --- a/Sicoob.Cobranca/Sicoob.Cobranca.csproj +++ b/Sicoob.Cobranca/Sicoob.Cobranca.csproj @@ -20,7 +20,6 @@ https://github.com/SharpSistemas/SicoobAPI README.md - True diff --git a/Sicoob.Conta/Sicoob.Conta.csproj b/Sicoob.Conta/Sicoob.Conta.csproj index 7e373ca..b7c7d61 100644 --- a/Sicoob.Conta/Sicoob.Conta.csproj +++ b/Sicoob.Conta/Sicoob.Conta.csproj @@ -19,7 +19,6 @@ README.md true $(NoWarn);1591 - True diff --git a/Sicoob.PIX/Sicoob.PIX.csproj b/Sicoob.PIX/Sicoob.PIX.csproj index bf4f7fd..04b2df3 100644 --- a/Sicoob.PIX/Sicoob.PIX.csproj +++ b/Sicoob.PIX/Sicoob.PIX.csproj @@ -22,7 +22,6 @@ README.md true $(NoWarn);1591 - True diff --git a/Sicoob.Shared/Sicoob.Shared.csproj b/Sicoob.Shared/Sicoob.Shared.csproj index 3ce85c9..5bee967 100644 --- a/Sicoob.Shared/Sicoob.Shared.csproj +++ b/Sicoob.Shared/Sicoob.Shared.csproj @@ -19,7 +19,6 @@ See examples and documentation on the GitHub page https://github.com/SharpSistemas/SicoobAPI - True