From d6b3515dbb0ae2d2b72d5329715aaac5e1a0584f Mon Sep 17 00:00:00 2001 From: Alcenir Moretto Date: Mon, 20 Oct 2025 06:43:18 -0300 Subject: [PATCH 1/8] =?UTF-8?q?#Scopos=20para=20Cobran=C3=A7a=20Bancaria?= =?UTF-8?q?=20V3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sicoob.Cobranca/Models/v3/IncluirBoleto.cs | 6 +-- Sicoob.Shared/Models/AuthorizationScope.cs | 48 +++++++++++++++++++++- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/Sicoob.Cobranca/Models/v3/IncluirBoleto.cs b/Sicoob.Cobranca/Models/v3/IncluirBoleto.cs index 3ab5805..c3ea290 100644 --- a/Sicoob.Cobranca/Models/v3/IncluirBoleto.cs +++ b/Sicoob.Cobranca/Models/v3/IncluirBoleto.cs @@ -29,15 +29,15 @@ public class IncluirBoletoRequest public int tipoDesconto { get; set; } [JsonConverter(typeof(CustomDateTimeConverter))] [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] - public DateTime dataPrimeiroDesconto { get; set; } + public DateTime? dataPrimeiroDesconto { get; set; } public decimal valorPrimeiroDesconto { get; set; } [JsonConverter(typeof(CustomDateTimeConverter))] [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] - public DateTime dataSegundoDesconto { get; set; } + public DateTime? dataSegundoDesconto { get; set; } public decimal valorSegundoDesconto { get; set; } [JsonConverter(typeof(CustomDateTimeConverter))] [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] - public DateTime dataTerceiroDesconto { get; set; } + public DateTime? dataTerceiroDesconto { get; set; } public decimal valorTerceiroDesconto { get; set; } public int tipoMulta { get; set; } [JsonConverter(typeof(CustomDateTimeConverter))] diff --git a/Sicoob.Shared/Models/AuthorizationScope.cs b/Sicoob.Shared/Models/AuthorizationScope.cs index 72f7daf..c710fe1 100644 --- a/Sicoob.Shared/Models/AuthorizationScope.cs +++ b/Sicoob.Shared/Models/AuthorizationScope.cs @@ -200,6 +200,31 @@ public class AuthorizationScope /// public bool COBRANCA_BOLETOS_FAIXA_NN_DISPONIVEIS { get; set; } + /* API Cobrança Bancária (v3) */ + /// + /// [API Cobrança Bancária V3] boletos_consulta: Permissão de consulta de boletos + /// + public bool COBRANCA_V3_BOLETOS_CONSULTA { get; set; } + /// + /// [API Cobrança Bancária V3] boletos_inclusao: Permissão de inclusão de boletos + /// + public bool COBRANCA_V3_BOLETOS_INCLUSAO { get; set; } + /// + /// [API Cobrança Bancária V3] boletos_alteracao: Permissão de alteração de boletos + /// + public bool COBRANCA_V3_BOLETOS_ALTERACAO { get; set; } + /// + /// [API Cobrança Bancária V3] webhooks_consulta: Permissão de consulta de webhooks + /// + public bool COBRANCA_V3_WEBHOOKS_CONSULTA { get; set; } + /// + /// [API Cobrança Bancária V3] boletos_inclusao: Permissão de inclusão de webhooks + /// + public bool COBRANCA_V3_WEBHOOKS_INCLUSAO { get; set; } + /// + /// [API Cobrança Bancária V3] webhooks_alteracao: Permissão de alteração de webhooks + /// + public bool COBRANCA_V3_WEBHOOKS_ALTERACAO { get; set; } /// /// Gera a lista de Scope utilizado na geração do Token @@ -266,6 +291,14 @@ public string[] ToScope() if (COBRANCA_BOLETOS_PIX) lst.Add("cobranca_boletos_pix"); if (COBRANCA_BOLETOS_FAIXA_NN_DISPONIVEIS) lst.Add("cobranca_boletos_faixa_nn_disponiveis"); + /* API Cobrança V3*/ + if (COBRANCA_V3_BOLETOS_CONSULTA) lst.Add("boletos_consulta"); + if (COBRANCA_V3_BOLETOS_INCLUSAO) lst.Add("boletos_inclusao"); + if (COBRANCA_V3_BOLETOS_ALTERACAO) lst.Add("boletos_alteracao"); + if (COBRANCA_V3_WEBHOOKS_CONSULTA) lst.Add("webhooks_consulta"); + if (COBRANCA_V3_WEBHOOKS_INCLUSAO) lst.Add("webhooks_inclusao"); + if (COBRANCA_V3_WEBHOOKS_ALTERACAO) lst.Add("webhooks_alteracao"); + return lst.ToArray(); } /// @@ -383,6 +416,17 @@ public AuthorizationScope Cobranca_Setar(bool value) return this; } + public AuthorizationScope CobrancaV3_Setar(bool value) + { + COBRANCA_V3_BOLETOS_CONSULTA = value; + COBRANCA_V3_BOLETOS_INCLUSAO = value; + COBRANCA_V3_BOLETOS_ALTERACAO = value; + COBRANCA_V3_WEBHOOKS_CONSULTA = value; + COBRANCA_V3_WEBHOOKS_INCLUSAO = value; + COBRANCA_V3_WEBHOOKS_ALTERACAO = value; + return this; + } + public AuthorizationScope RemoverTodos() { return setarTodosComo(false); @@ -421,8 +465,10 @@ public static AuthorizationScope TodosContaPoupanca() { return new AuthorizationScope().CPoupanca_Setar(true); } - public static AuthorizationScope TodosCobranca() + public static AuthorizationScope TodosCobranca(bool v3 = false) { + if(v3) + return new AuthorizationScope().CobrancaV3_Setar(true); return new AuthorizationScope().Cobranca_Setar(true); } } From 0c8feeff7e5142b85fd163c1c802bdd27abecec4 Mon Sep 17 00:00:00 2001 From: alcenir Date: Mon, 20 Oct 2025 16:46:52 -0300 Subject: [PATCH 2/8] #Adicionado rotas para crud de webhooks --- .../Models/v3/ConsultaWebhookRequest.cs | 40 ++++++++++++ Sicoob.Cobranca/Models/v3/IncluirWebhook.cs | 20 ++++++ Sicoob.Cobranca/SicoobCobrancaV3.cs | 64 +++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 Sicoob.Cobranca/Models/v3/ConsultaWebhookRequest.cs create mode 100644 Sicoob.Cobranca/Models/v3/IncluirWebhook.cs diff --git a/Sicoob.Cobranca/Models/v3/ConsultaWebhookRequest.cs b/Sicoob.Cobranca/Models/v3/ConsultaWebhookRequest.cs new file mode 100644 index 0000000..5a7f1b8 --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/ConsultaWebhookRequest.cs @@ -0,0 +1,40 @@ +namespace Sicoob.Cobranca.Models.v3; + +using System; +using Newtonsoft.Json; +using Sicoob.Cobranca.Models.Shared; + +public class ConsultaWebhookRequest +{ + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public long? idWebhook { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public int? codigoTipoMovimento { get; set; } +} + +public class ConsultaWebhookResponse +{ + public DadosWebhook[]? resultado { get; set; } +} + +public class IncluirWebhooksResponse +{ + public DadosWebhook? resultado { get; set; } +} + +public class DadosWebhook +{ + public long idWebhook { get; set; } + public string url { get; set; } + public string email { get; set; } + public int codigoTipoMovimento { get; set; } + public string descricaoTipoMovimento { get; set; } + public int codigoPeriodoMovimento { get; set; } + public string descricaoPeriodoMovimento { get; set; } + public int codigoSituacao { get; set; } + public string descricaoSituacao { get; set; } + public DateTime dataHoraCadastro { get; set; } + public DateTime dataHoraUltimaAlteracao { get; set; } + public DateTime dataHoraInativacao { get; set; } + public string descricaoMotivoInativacao { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/v3/IncluirWebhook.cs b/Sicoob.Cobranca/Models/v3/IncluirWebhook.cs new file mode 100644 index 0000000..bd97b3f --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/IncluirWebhook.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Sicoob.Cobranca.Models.Shared; + +namespace Sicoob.Cobranca.Models.v3; + +public class AlterarWebhookRequest +{ + public string url { get; set; } + public string email { get; set; } +} + +public class IncluirWebhookRequest : AlterarBoletoRequest +{ + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public int codigoTipoMovimento { get; set; } + [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] + public int codigoPeriodoMovimento { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/SicoobCobrancaV3.cs b/Sicoob.Cobranca/SicoobCobrancaV3.cs index de4b06b..ecd218b 100644 --- a/Sicoob.Cobranca/SicoobCobrancaV3.cs +++ b/Sicoob.Cobranca/SicoobCobrancaV3.cs @@ -214,6 +214,70 @@ public async Task BaixarMovimentacoes(int codigoSolicit return lst.ToArray(); } + /* Webhook */ + + /// + /// Consultar os webhooks cadastrados. + /// Serviço para consultar os detalhes dos webhooks cadastrados. + /// + /// Identificador único do webhook. + /// Código do tipo de movimento do webhook. 7 - Pagamento (Baixa operacional) + /// Boleto buscado + public async Task ConsultarWebhooks(long? idWebhook = null, int? codigoTipoMovimento = null) + { + var consulta = new ConsultaWebhookRequest() + { + idWebhook = idWebhook, + codigoTipoMovimento = codigoTipoMovimento + }; + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks", consulta)); + } + + /// + /// Cadastrar um webhook para receber notificações de acordo com o tipo de movimento. + /// Este serviço permite cadastrar uma URL que será notificada sempre que ocorrer um evento associado a um tipo de movimento. O webhook pode ser configurado para o período de movimentação atual (D0). + /// + /// Dados para inclusão do webhook. + /// + public async Task IncluirWebhook(IncluirWebhookRequest webhook) + { + return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks", webhook)); + } + + /// + /// Atualizar um webhook cadastrado. + /// Serviço de atualização de webhook. Ao modificar a URL, a situação do webhook será automaticamente alterada para '1 - Aguardando validação' e permanecerá assim até que a nova URL seja validada com sucesso. + /// + /// Identificador único do webhook. + /// Dados para alteração do webhook. + /// + public async Task AlterarWebhook(long idWebhook, AlterarWebhookRequest webhook) + { + await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook, webhook)); + } + + /// + /// Excluir um webhook. + /// Serviço responsável por remover permanentemente um webhook registrado, encerrando o envio de notificações para a URL vinculada." + /// + /// Identificador único do webhook. + /// + public async Task ExcluirWebhook(long idWebhook) + { + await ExecutaChamadaAsync(() => clientApi.DeleteAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook)); + } + + /// + /// Reativar um webhook inativo. + /// Serviço de reativação de webhook desativado, restabelecendo o recebimento de notificações. A situação do webhook será atualizada para '1 - Aguardando validação' e permanecerá assim até que a URL seja validada com sucesso. + /// + /// Identificador único do webhook. + /// + public async Task ReativarWebhook(long idWebhook) + { + await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook + "/reativar", null)); + } + private void SalvarCopiaMovimentacao(byte[] bytesZip, string nomeArquivo) { if (PastaCopiaMovimentacoes == null) return; From b43b7d676c603d1a579ab8b19c00961db06b00e7 Mon Sep 17 00:00:00 2001 From: Alcenir Moretto Date: Mon, 20 Oct 2025 21:36:35 -0300 Subject: [PATCH 3/8] #Ajustes webhook --- .../Models/v3/ConsultaWebhookRequest.cs | 63 ++++++++++++++++++- Sicoob.Cobranca/Models/v3/IncluirWebhook.cs | 5 +- Sicoob.Cobranca/SicoobCobrancaV3.cs | 60 +++++++++++++----- 3 files changed, 106 insertions(+), 22 deletions(-) diff --git a/Sicoob.Cobranca/Models/v3/ConsultaWebhookRequest.cs b/Sicoob.Cobranca/Models/v3/ConsultaWebhookRequest.cs index 5a7f1b8..562afdd 100644 --- a/Sicoob.Cobranca/Models/v3/ConsultaWebhookRequest.cs +++ b/Sicoob.Cobranca/Models/v3/ConsultaWebhookRequest.cs @@ -1,8 +1,8 @@ namespace Sicoob.Cobranca.Models.v3; using System; +using System.Diagnostics; using Newtonsoft.Json; -using Sicoob.Cobranca.Models.Shared; public class ConsultaWebhookRequest { @@ -17,6 +17,29 @@ public class ConsultaWebhookResponse public DadosWebhook[]? resultado { get; set; } } +public class ConsultaSolicitacoesWebhookRequest +{ + [JsonConverter(typeof(CustomDateTimeConverter))] + public DateTime dataSolicitacao { get; set; } + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public int? pagina { get; set; } + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public int? codigoSolicitacaoSituacao { get; set; } + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public string? codigoBarras { get; set; } = null; + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public int? nossoNumero { get; set; } +} + +public class ConsultaSolicitacoesWebhookResponse +{ + public SolicitacoesWebhookResponse? resultado { get; set; } +} + public class IncluirWebhooksResponse { public DadosWebhook? resultado { get; set; } @@ -25,7 +48,7 @@ public class IncluirWebhooksResponse public class DadosWebhook { public long idWebhook { get; set; } - public string url { get; set; } + public string url { get; set; } = null; public string email { get; set; } public int codigoTipoMovimento { get; set; } public string descricaoTipoMovimento { get; set; } @@ -37,4 +60,40 @@ public class DadosWebhook public DateTime dataHoraUltimaAlteracao { get; set; } public DateTime dataHoraInativacao { get; set; } public string descricaoMotivoInativacao { get; set; } +} + +public class SolicitacoesWebhookResponse +{ + public int paginaAtual { get; set; } + public int totalPaginas { get; set; } + public int totalRegistros { get; set; } + public DadosSolicitacoesWebhookResponse[] webhookSolicitacoes { get; set; } +} + +public class DadosSolicitacoesWebhookResponse +{ + public int codigoWebhookSituacao { get; set; } + public string descricaoWebhookSituacao { get; set; } + public int codigoSolicitacaoSituacao { get; set; } + public string descricaoSolicitacaoSituacao { get; set; } + public int codigoTipoMovimento { get; set; } + public string descricaoTipoMovimento { get; set; } + public int codigoPeriodoMovimento { get; set; } + public string descricaoPeriodoMovimento { get; set; } + public string descricaoErroProcessamento { get; set; } + public DateTime dataHoraCadastro { get; set; } + public bool validacaoWebhook { get; set; } + public int nossoNumero { get; set; } + public string codigoBarras { get; set; } + public DadosSolicitacoesWebhookNotificacoesResponse[] webhookNotificacoes { get; set; } +} + +public class DadosSolicitacoesWebhookNotificacoesResponse +{ + public string url { get; set; } + public DateTime dataHoraInicio { get; set; } + public DateTime dataHoraFim { get; set; } + public int tempoComunicao { get; set; } + public int codigoStatusRequisicao { get; set; } + public string descricaoCodigoStatusRequisicao { get; set; } } \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/v3/IncluirWebhook.cs b/Sicoob.Cobranca/Models/v3/IncluirWebhook.cs index bd97b3f..a927b3a 100644 --- a/Sicoob.Cobranca/Models/v3/IncluirWebhook.cs +++ b/Sicoob.Cobranca/Models/v3/IncluirWebhook.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; using Newtonsoft.Json; -using Sicoob.Cobranca.Models.Shared; namespace Sicoob.Cobranca.Models.v3; @@ -11,7 +8,7 @@ public class AlterarWebhookRequest public string email { get; set; } } -public class IncluirWebhookRequest : AlterarBoletoRequest +public class IncluirWebhookRequest : AlterarWebhookRequest { [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public int codigoTipoMovimento { get; set; } diff --git a/Sicoob.Cobranca/SicoobCobrancaV3.cs b/Sicoob.Cobranca/SicoobCobrancaV3.cs index ecd218b..3b85447 100644 --- a/Sicoob.Cobranca/SicoobCobrancaV3.cs +++ b/Sicoob.Cobranca/SicoobCobrancaV3.cs @@ -222,25 +222,34 @@ public async Task BaixarMovimentacoes(int codigoSolicit /// /// Identificador único do webhook. /// Código do tipo de movimento do webhook. 7 - Pagamento (Baixa operacional) - /// Boleto buscado - public async Task ConsultarWebhooks(long? idWebhook = null, int? codigoTipoMovimento = null) + /// Webhooks cadastradros. + public async Task ConsultarWebHooksAsync(long? idWebhook = null, int? codigoTipoMovimento = null) { var consulta = new ConsultaWebhookRequest() { idWebhook = idWebhook, codigoTipoMovimento = codigoTipoMovimento }; - return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks", consulta)); + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks", consulta)); } /// /// Cadastrar um webhook para receber notificações de acordo com o tipo de movimento. /// Este serviço permite cadastrar uma URL que será notificada sempre que ocorrer um evento associado a um tipo de movimento. O webhook pode ser configurado para o período de movimentação atual (D0). /// - /// Dados para inclusão do webhook. + /// Url a ser chamada com POST. A URL deve ser https. + /// E-mail associado ao webhook. + /// Código do tipo de movimento do webhook. 7 - Pagamento (Baixa operacional) + /// Código do período de movimento. 1 - Movimento atual (D0) /// - public async Task IncluirWebhook(IncluirWebhookRequest webhook) - { + public async Task CriarWebHookAsync(string url, string email, int codigoTipoMovimento = 7, int codigoPeriodoMovimento = 1) { + IncluirWebhookRequest webhook = new IncluirWebhookRequest() + { + url = url, + email = email, + codigoTipoMovimento = codigoTipoMovimento, + codigoPeriodoMovimento = codigoPeriodoMovimento + }; return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks", webhook)); } @@ -251,10 +260,9 @@ public async Task ConsultarWebhooks(long? idWebhook = /// Identificador único do webhook. /// Dados para alteração do webhook. /// - public async Task AlterarWebhook(long idWebhook, AlterarWebhookRequest webhook) - { - await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook, webhook)); - } + public async Task AlterarWebhookAsync(long idWebhook, AlterarWebhookRequest webhook) + => await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook, webhook)); + /// /// Excluir um webhook. @@ -262,10 +270,8 @@ public async Task AlterarWebhook(long idWebhook, AlterarWebhookRequest webhook) /// /// Identificador único do webhook. /// - public async Task ExcluirWebhook(long idWebhook) - { - await ExecutaChamadaAsync(() => clientApi.DeleteAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook)); - } + public async Task ExcluirWebhookAsync(long idWebhook) + => await ExecutaChamadaAsync(() => clientApi.DeleteAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook)); /// /// Reativar um webhook inativo. @@ -273,9 +279,31 @@ public async Task ExcluirWebhook(long idWebhook) /// /// Identificador único do webhook. /// - public async Task ReativarWebhook(long idWebhook) + public async Task ReativarWebhookAsync(long idWebhook) + => await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook + "/reativar", null)); + + /// + /// Consultar solicitações de um webhook. + /// Consulta as solicitações de notificação para um webhook com base na data de solicitação informada. + /// + /// Identificador único do webhook. + /// Data da solicitação. Formato: yyyy-MM-dd + /// Número da página a ser consultada. + /// Código da situação da solicitação do webhook. 2 - Aguardando envio, 3 - Enviado com sucesso e 6 - Erro no envio + /// Código de barras do boleto presente na notificação webhook + /// Nosso número do boleto presente na notificação webhook + /// Retorna o histórico das tentativas de notificação, incluindo o status e a resposta da requisição. + public async Task SolicitacoesWebhooks(long idWebhook, DateTime dataSolicitacao, int? pagina = null, int? codigoSolicitacaoSituacao = null, string? codigoBarras = null, int? nossoNumero = null) { - await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook + "/reativar", null)); + var consulta = new ConsultaSolicitacoesWebhookRequest() + { + dataSolicitacao = dataSolicitacao, + codigoBarras = codigoBarras, + nossoNumero = nossoNumero, + codigoSolicitacaoSituacao = codigoSolicitacaoSituacao, + pagina = pagina + }; + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/webhooks/" + idWebhook + "/solicitacoes", consulta)); } private void SalvarCopiaMovimentacao(byte[] bytesZip, string nomeArquivo) From f1ccc10d3888b1432e6f0ee6e0b1a8f4f01b9d03 Mon Sep 17 00:00:00 2001 From: Alcenir Moretto Date: Fri, 24 Oct 2025 06:17:36 -0300 Subject: [PATCH 4/8] #Inicio Sicoob.Convenio --- PIX-Sicoob.sln | 74 +++++++++++++++++++ Sicoob.Cobranca/Models/Shared/DadosPagador.cs | 2 +- Sicoob.Convenio/Models/IncluirOptante.cs | 32 ++++++++ Sicoob.Convenio/Sicoob.Convenio.csproj | 24 ++++++ Sicoob.Convenio/SicoobConvenio.cs | 66 +++++++++++++++++ Sicoob.Shared/Models/AuthorizationScope.cs | 27 ++++++- 6 files changed, 223 insertions(+), 2 deletions(-) create mode 100644 Sicoob.Convenio/Models/IncluirOptante.cs create mode 100644 Sicoob.Convenio/Sicoob.Convenio.csproj create mode 100644 Sicoob.Convenio/SicoobConvenio.cs diff --git a/PIX-Sicoob.sln b/PIX-Sicoob.sln index ab88966..b69a655 100644 --- a/PIX-Sicoob.sln +++ b/PIX-Sicoob.sln @@ -17,40 +17,114 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sicoob.Cobranca", "Sicoob.C EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sicoob.Conta", "Sicoob.Conta\Sicoob.Conta.csproj", "{CB15FFEA-0F15-4928-AB43-19E61BADD1FE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sicoob.Convenio", "Sicoob.Convenio\Sicoob.Convenio.csproj", "{E30BB376-08EC-4013-B953-167DE41D4093}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Debug|x64.ActiveCfg = Debug|Any CPU + {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Debug|x64.Build.0 = Debug|Any CPU + {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Debug|x86.ActiveCfg = Debug|Any CPU + {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Debug|x86.Build.0 = Debug|Any CPU {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Release|Any CPU.ActiveCfg = Release|Any CPU {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Release|Any CPU.Build.0 = Release|Any CPU + {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Release|x64.ActiveCfg = Release|Any CPU + {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Release|x64.Build.0 = Release|Any CPU + {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Release|x86.ActiveCfg = Release|Any CPU + {F4E1E8D3-9690-48C0-BDAB-8E89C6486BA1}.Release|x86.Build.0 = Release|Any CPU {31571823-D5E5-4F24-8A33-33006862268F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {31571823-D5E5-4F24-8A33-33006862268F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31571823-D5E5-4F24-8A33-33006862268F}.Debug|x64.ActiveCfg = Debug|Any CPU + {31571823-D5E5-4F24-8A33-33006862268F}.Debug|x64.Build.0 = Debug|Any CPU + {31571823-D5E5-4F24-8A33-33006862268F}.Debug|x86.ActiveCfg = Debug|Any CPU + {31571823-D5E5-4F24-8A33-33006862268F}.Debug|x86.Build.0 = Debug|Any CPU {31571823-D5E5-4F24-8A33-33006862268F}.Release|Any CPU.ActiveCfg = Release|Any CPU {31571823-D5E5-4F24-8A33-33006862268F}.Release|Any CPU.Build.0 = Release|Any CPU + {31571823-D5E5-4F24-8A33-33006862268F}.Release|x64.ActiveCfg = Release|Any CPU + {31571823-D5E5-4F24-8A33-33006862268F}.Release|x64.Build.0 = Release|Any CPU + {31571823-D5E5-4F24-8A33-33006862268F}.Release|x86.ActiveCfg = Release|Any CPU + {31571823-D5E5-4F24-8A33-33006862268F}.Release|x86.Build.0 = Release|Any CPU {C796024A-477D-460A-B511-D6188415FFA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C796024A-477D-460A-B511-D6188415FFA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C796024A-477D-460A-B511-D6188415FFA2}.Debug|x64.ActiveCfg = Debug|Any CPU + {C796024A-477D-460A-B511-D6188415FFA2}.Debug|x64.Build.0 = Debug|Any CPU + {C796024A-477D-460A-B511-D6188415FFA2}.Debug|x86.ActiveCfg = Debug|Any CPU + {C796024A-477D-460A-B511-D6188415FFA2}.Debug|x86.Build.0 = Debug|Any CPU {C796024A-477D-460A-B511-D6188415FFA2}.Release|Any CPU.ActiveCfg = Release|Any CPU {C796024A-477D-460A-B511-D6188415FFA2}.Release|Any CPU.Build.0 = Release|Any CPU + {C796024A-477D-460A-B511-D6188415FFA2}.Release|x64.ActiveCfg = Release|Any CPU + {C796024A-477D-460A-B511-D6188415FFA2}.Release|x64.Build.0 = Release|Any CPU + {C796024A-477D-460A-B511-D6188415FFA2}.Release|x86.ActiveCfg = Release|Any CPU + {C796024A-477D-460A-B511-D6188415FFA2}.Release|x86.Build.0 = Release|Any CPU {0466318D-33CF-46ED-8466-3809F01A97C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0466318D-33CF-46ED-8466-3809F01A97C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0466318D-33CF-46ED-8466-3809F01A97C3}.Debug|x64.ActiveCfg = Debug|Any CPU + {0466318D-33CF-46ED-8466-3809F01A97C3}.Debug|x64.Build.0 = Debug|Any CPU + {0466318D-33CF-46ED-8466-3809F01A97C3}.Debug|x86.ActiveCfg = Debug|Any CPU + {0466318D-33CF-46ED-8466-3809F01A97C3}.Debug|x86.Build.0 = Debug|Any CPU {0466318D-33CF-46ED-8466-3809F01A97C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {0466318D-33CF-46ED-8466-3809F01A97C3}.Release|Any CPU.Build.0 = Release|Any CPU + {0466318D-33CF-46ED-8466-3809F01A97C3}.Release|x64.ActiveCfg = Release|Any CPU + {0466318D-33CF-46ED-8466-3809F01A97C3}.Release|x64.Build.0 = Release|Any CPU + {0466318D-33CF-46ED-8466-3809F01A97C3}.Release|x86.ActiveCfg = Release|Any CPU + {0466318D-33CF-46ED-8466-3809F01A97C3}.Release|x86.Build.0 = Release|Any CPU {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Debug|x64.ActiveCfg = Debug|Any CPU + {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Debug|x64.Build.0 = Debug|Any CPU + {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Debug|x86.ActiveCfg = Debug|Any CPU + {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Debug|x86.Build.0 = Debug|Any CPU {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Release|Any CPU.Build.0 = Release|Any CPU + {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Release|x64.ActiveCfg = Release|Any CPU + {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Release|x64.Build.0 = Release|Any CPU + {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Release|x86.ActiveCfg = Release|Any CPU + {4C140134-CF64-4104-82CA-5A09AD0E2AF5}.Release|x86.Build.0 = Release|Any CPU {05DD23BA-333E-4024-95A7-A9A1A8719925}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {05DD23BA-333E-4024-95A7-A9A1A8719925}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05DD23BA-333E-4024-95A7-A9A1A8719925}.Debug|x64.ActiveCfg = Debug|Any CPU + {05DD23BA-333E-4024-95A7-A9A1A8719925}.Debug|x64.Build.0 = Debug|Any CPU + {05DD23BA-333E-4024-95A7-A9A1A8719925}.Debug|x86.ActiveCfg = Debug|Any CPU + {05DD23BA-333E-4024-95A7-A9A1A8719925}.Debug|x86.Build.0 = Debug|Any CPU {05DD23BA-333E-4024-95A7-A9A1A8719925}.Release|Any CPU.ActiveCfg = Release|Any CPU {05DD23BA-333E-4024-95A7-A9A1A8719925}.Release|Any CPU.Build.0 = Release|Any CPU + {05DD23BA-333E-4024-95A7-A9A1A8719925}.Release|x64.ActiveCfg = Release|Any CPU + {05DD23BA-333E-4024-95A7-A9A1A8719925}.Release|x64.Build.0 = Release|Any CPU + {05DD23BA-333E-4024-95A7-A9A1A8719925}.Release|x86.ActiveCfg = Release|Any CPU + {05DD23BA-333E-4024-95A7-A9A1A8719925}.Release|x86.Build.0 = Release|Any CPU {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Debug|x64.ActiveCfg = Debug|Any CPU + {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Debug|x64.Build.0 = Debug|Any CPU + {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Debug|x86.Build.0 = Debug|Any CPU {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Release|Any CPU.Build.0 = Release|Any CPU + {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Release|x64.ActiveCfg = Release|Any CPU + {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Release|x64.Build.0 = Release|Any CPU + {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Release|x86.ActiveCfg = Release|Any CPU + {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Release|x86.Build.0 = Release|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|x64.ActiveCfg = Debug|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|x64.Build.0 = Debug|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|x86.ActiveCfg = Debug|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|x86.Build.0 = Debug|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Release|Any CPU.Build.0 = Release|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Release|x64.ActiveCfg = Release|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Release|x64.Build.0 = Release|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Release|x86.ActiveCfg = Release|Any CPU + {E30BB376-08EC-4013-B953-167DE41D4093}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Sicoob.Cobranca/Models/Shared/DadosPagador.cs b/Sicoob.Cobranca/Models/Shared/DadosPagador.cs index 310eafb..1a80ba7 100644 --- a/Sicoob.Cobranca/Models/Shared/DadosPagador.cs +++ b/Sicoob.Cobranca/Models/Shared/DadosPagador.cs @@ -9,5 +9,5 @@ public class DadosPagador public string cidade { get; set; } public string cep { get; set; } public string uf { get; set; } - public string[] email { get; set; } + public string email { get; set; } } diff --git a/Sicoob.Convenio/Models/IncluirOptante.cs b/Sicoob.Convenio/Models/IncluirOptante.cs new file mode 100644 index 0000000..accf86e --- /dev/null +++ b/Sicoob.Convenio/Models/IncluirOptante.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Sicoob.Convenio.Models; + +public class IncluirOptanteRequest +{ + public Optante optante { get; set; } + public long transacao { get; set; } +} + +public class IncluirOptanteResponse +{ + public string mensagem { get; set; } + public int codigo { get; set; } + public string autenticacao { get; set; } +} + +public class Optante +{ + public string convenio { get; set; } + + public string identificadorClienteEmpresa { get; set; } + + public string identificadorClienteBanco { get; set; } + + public int dataOpcao { get; set; } + + public int codigoMovimento { get; set; } + +} \ No newline at end of file diff --git a/Sicoob.Convenio/Sicoob.Convenio.csproj b/Sicoob.Convenio/Sicoob.Convenio.csproj new file mode 100644 index 0000000..ee657eb --- /dev/null +++ b/Sicoob.Convenio/Sicoob.Convenio.csproj @@ -0,0 +1,24 @@ + + + + net9.0 + enable + enable + + + + + True + \ + + + + + + + + + + + + diff --git a/Sicoob.Convenio/SicoobConvenio.cs b/Sicoob.Convenio/SicoobConvenio.cs new file mode 100644 index 0000000..a11af33 --- /dev/null +++ b/Sicoob.Convenio/SicoobConvenio.cs @@ -0,0 +1,66 @@ +/****************************************************************\ + * Biblioteca C# para APIs de Convenio Cobrança do SICOOB * + * Autor: Alcenir Moretto * + * https://github.com/Alcenir/SicoobAPI/Sicoob.Cobranca * +\****************************************************************/ +namespace Sicoob.Convenio; + +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 Convênios do Sicoob +/// +public sealed class SicoobConvenio : Shared.Sicoob +{ + // Documentações + // > APIs tipo "Swagger": + // https://developers.sicoob.com.br/#!/apis + + private readonly int numeroContrato; + private ClientInfo clientApi; + private ConfiguracaoAPI ConfigApi { get; } + + public SicoobConvenio(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); + } + + /* Optantes */ + public async Task IncluirBoletos(IncluirOptanteRequest boleto) + { + return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos", boleto)); + } +} diff --git a/Sicoob.Shared/Models/AuthorizationScope.cs b/Sicoob.Shared/Models/AuthorizationScope.cs index c710fe1..784e387 100644 --- a/Sicoob.Shared/Models/AuthorizationScope.cs +++ b/Sicoob.Shared/Models/AuthorizationScope.cs @@ -226,6 +226,15 @@ public class AuthorizationScope /// public bool COBRANCA_V3_WEBHOOKS_ALTERACAO { get; set; } + /// + /// [API Convênios Pagamentos] convenios_consulta: Permissão de consulta de Api de Convênio de Pagamentos + /// + public bool CONVENIO_PAGAMENTOS_CONSULTA { get; set; } + /// + /// [API Convênios Pagamentos] convenios_consulta: Permissão de escrita de Api de Convênio de Pagamentos + /// + public bool CONVENIO_PAGAMENTOS_ESCRITA { get; set; } + /// /// Gera a lista de Scope utilizado na geração do Token /// @@ -299,6 +308,10 @@ public string[] ToScope() if (COBRANCA_V3_WEBHOOKS_INCLUSAO) lst.Add("webhooks_inclusao"); if (COBRANCA_V3_WEBHOOKS_ALTERACAO) lst.Add("webhooks_alteracao"); + /* API Convênios Pagamentos */ + if (CONVENIO_PAGAMENTOS_CONSULTA) lst.Add("convenios_consulta"); + if (CONVENIO_PAGAMENTOS_ESCRITA) lst.Add("convenios_escrita"); + return lst.ToArray(); } /// @@ -427,6 +440,13 @@ public AuthorizationScope CobrancaV3_Setar(bool value) return this; } + public AuthorizationScope Convenio_Setar(bool value) + { + CONVENIO_PAGAMENTOS_CONSULTA = value; + CONVENIO_PAGAMENTOS_ESCRITA = value; + return this; + } + public AuthorizationScope RemoverTodos() { return setarTodosComo(false); @@ -467,8 +487,13 @@ public static AuthorizationScope TodosContaPoupanca() } public static AuthorizationScope TodosCobranca(bool v3 = false) { - if(v3) + if (v3) return new AuthorizationScope().CobrancaV3_Setar(true); return new AuthorizationScope().Cobranca_Setar(true); } + + public static AuthorizationScope TodosConvenioCobranca() + { + return new AuthorizationScope().Convenio_Setar(true); + } } From c0f83b7fcf06b79b08c9595820dfc006f359b713 Mon Sep 17 00:00:00 2001 From: alcenir Date: Fri, 24 Oct 2025 10:45:52 -0300 Subject: [PATCH 5/8] =?UTF-8?q?#Altera=C3=A7=C3=A3o=20pagador,=20consulta?= =?UTF-8?q?=20faixas=20noss=20numero=20dispon=C3=ADvel=20e=20outras=20rota?= =?UTF-8?q?s=20da=20api=20v3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PIX-Sicoob.sln | 14 ---- Sicoob.Cobranca/Models/Shared/DadosPagador.cs | 5 ++ .../Models/v3/ConsultaFaixasNossoNumero.cs | 9 +++ Sicoob.Cobranca/SicoobCobrancaV3.cs | 74 +++++++++++++++++-- Sicoob.Convenio/Models/IncluirOptante.cs | 32 -------- Sicoob.Convenio/Sicoob.Convenio.csproj | 24 ------ Sicoob.Convenio/SicoobConvenio.cs | 66 ----------------- 7 files changed, 83 insertions(+), 141 deletions(-) create mode 100644 Sicoob.Cobranca/Models/v3/ConsultaFaixasNossoNumero.cs delete mode 100644 Sicoob.Convenio/Models/IncluirOptante.cs delete mode 100644 Sicoob.Convenio/Sicoob.Convenio.csproj delete mode 100644 Sicoob.Convenio/SicoobConvenio.cs diff --git a/PIX-Sicoob.sln b/PIX-Sicoob.sln index b69a655..aa4080a 100644 --- a/PIX-Sicoob.sln +++ b/PIX-Sicoob.sln @@ -17,8 +17,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sicoob.Cobranca", "Sicoob.C EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sicoob.Conta", "Sicoob.Conta\Sicoob.Conta.csproj", "{CB15FFEA-0F15-4928-AB43-19E61BADD1FE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sicoob.Convenio", "Sicoob.Convenio\Sicoob.Convenio.csproj", "{E30BB376-08EC-4013-B953-167DE41D4093}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -113,18 +111,6 @@ Global {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Release|x64.Build.0 = Release|Any CPU {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Release|x86.ActiveCfg = Release|Any CPU {CB15FFEA-0F15-4928-AB43-19E61BADD1FE}.Release|x86.Build.0 = Release|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|x64.ActiveCfg = Debug|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|x64.Build.0 = Debug|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|x86.ActiveCfg = Debug|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Debug|x86.Build.0 = Debug|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Release|Any CPU.Build.0 = Release|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Release|x64.ActiveCfg = Release|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Release|x64.Build.0 = Release|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Release|x86.ActiveCfg = Release|Any CPU - {E30BB376-08EC-4013-B953-167DE41D4093}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Sicoob.Cobranca/Models/Shared/DadosPagador.cs b/Sicoob.Cobranca/Models/Shared/DadosPagador.cs index 1a80ba7..6c6ad5a 100644 --- a/Sicoob.Cobranca/Models/Shared/DadosPagador.cs +++ b/Sicoob.Cobranca/Models/Shared/DadosPagador.cs @@ -11,3 +11,8 @@ public class DadosPagador public string uf { get; set; } public string email { get; set; } } + +public class DadosPagadorRequest : DadosPagador +{ + public long numeroCliente { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/Models/v3/ConsultaFaixasNossoNumero.cs b/Sicoob.Cobranca/Models/v3/ConsultaFaixasNossoNumero.cs new file mode 100644 index 0000000..89781de --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/ConsultaFaixasNossoNumero.cs @@ -0,0 +1,9 @@ +namespace Sicoob.Cobranca.Models.v3; + +public class ConsultaFaixasNossoNumeroRequest +{ + public int numeroCliente { get; set; } + public int codigoModalidade { get; set; } + public int quantidade { get; set; } + public int? numeroContratoCobranca { get; set; } +} \ No newline at end of file diff --git a/Sicoob.Cobranca/SicoobCobrancaV3.cs b/Sicoob.Cobranca/SicoobCobrancaV3.cs index 3b85447..c47a8f2 100644 --- a/Sicoob.Cobranca/SicoobCobrancaV3.cs +++ b/Sicoob.Cobranca/SicoobCobrancaV3.cs @@ -127,6 +127,28 @@ public async Task ConsultarBoletosPagador(string { return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos", boleto)); } + + /// + /// Consulta de dados de faixas de nosso número disponíveis. + /// Serviço para consulta de dados de faixas de nosso número disponíveis. + /// Quando o campo validaDigitoVerificadorNossoNumero retornar o valor "0" a faixa "numeroInicial" e "numeroFinal" refere-se a numeração final (exemplo: 10 e 15 - utilização: 1-0 1-1 1-2 1-3 1-4 1-5). + /// Mas se o campo validaDigitoVerificadorNossoNumero retornar o valor "1" a faixa "numeroInicial" e "numeroFinal" deverá ser calculado o DV (exemplo: 10 e 15 - utilização: 10-4 11-8 12-0 13-1 14-7 15-9). + /// + /// + /// + /// + /// + public async Task ConsultarFaixasNossoNumeroDisponivel(int quantidade, int modalidade = (int)Modalidade.SimplesComRegistro, int? numeroContratoCobranca = null) + { + var consulta = new ConsultaFaixasNossoNumeroRequest() + { + codigoModalidade = modalidade, + numeroCliente = numeroContrato, + quantidade = quantidade, + numeroContratoCobranca = numeroContratoCobranca + }; + return await ExecutaChamadaAsync(() => clientApi.GetAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos/faixas-nosso-numero", consulta)); + } public async Task BaixarBoletos(int nossoNumero, int codigoModalidade) { @@ -137,22 +159,64 @@ public async Task BaixarBoletos(int nossoNumero, int codigoModalidade) }; await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/baixar", baixa)); } + + public async Task AlterarBoleto(int nossoNumero, AlterarBoletoRequest boletos) + { + await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos/" + nossoNumero, boletos)); + } + + /* Pagador */ + public async Task PagadorBoletos(DadosPagadorRequest dadosPagador) + => await ExecutaChamadaAsync(() => clientApi.PutAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/pagadores", dadosPagador)); + + /* Negativação */ + public async Task NegativarBoletos(int nossoNumero, int codigoModalidade) + { + var protesto = new ProtestoRequest + { + numeroCliente = numeroContrato, + codigoModalidade = codigoModalidade, + }; + await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/negativacoes", protesto)); + } + public async Task CancelarNegativacaoBoletos(int nossoNumero, int codigoModalidade) + { + var protesto = new ProtestoRequest + { + numeroCliente = numeroContrato, + codigoModalidade = codigoModalidade, + }; + await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/negativacoes", protesto)); + } + + public async Task BaixarNegativacaoBoletos(int nossoNumero) + => await ExecutaChamadaAsync(() => clientApi.DeleteAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/negativacoes")); + + /* Protesto */ 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) + + public async Task CancelarProtestoBoletos(int nossoNumero, int codigoModalidade) { - await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos/" + nossoNumero, boletos)); + var protesto = new ProtestoRequest + { + numeroCliente = numeroContrato, + codigoModalidade = codigoModalidade, + }; + await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/protestos", protesto)); } + public async Task DesistirProtestoBoletos(int nossoNumero) + => await ExecutaChamadaAsync(() => clientApi.DeleteAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/protestos")); + /* Movimentação */ public async Task SolicitarMovimentacao(Tipo tipoMovimento, DateTime data) { @@ -293,7 +357,7 @@ public async Task ReativarWebhookAsync(long idWebhook) /// Código de barras do boleto presente na notificação webhook /// Nosso número do boleto presente na notificação webhook /// Retorna o histórico das tentativas de notificação, incluindo o status e a resposta da requisição. - public async Task SolicitacoesWebhooks(long idWebhook, DateTime dataSolicitacao, int? pagina = null, int? codigoSolicitacaoSituacao = null, string? codigoBarras = null, int? nossoNumero = null) + public async Task SolicitacoesWebhooksAsync(long idWebhook, DateTime dataSolicitacao, int? pagina = null, int? codigoSolicitacaoSituacao = null, string? codigoBarras = null, int? nossoNumero = null) { var consulta = new ConsultaSolicitacoesWebhookRequest() { diff --git a/Sicoob.Convenio/Models/IncluirOptante.cs b/Sicoob.Convenio/Models/IncluirOptante.cs deleted file mode 100644 index accf86e..0000000 --- a/Sicoob.Convenio/Models/IncluirOptante.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace Sicoob.Convenio.Models; - -public class IncluirOptanteRequest -{ - public Optante optante { get; set; } - public long transacao { get; set; } -} - -public class IncluirOptanteResponse -{ - public string mensagem { get; set; } - public int codigo { get; set; } - public string autenticacao { get; set; } -} - -public class Optante -{ - public string convenio { get; set; } - - public string identificadorClienteEmpresa { get; set; } - - public string identificadorClienteBanco { get; set; } - - public int dataOpcao { get; set; } - - public int codigoMovimento { get; set; } - -} \ No newline at end of file diff --git a/Sicoob.Convenio/Sicoob.Convenio.csproj b/Sicoob.Convenio/Sicoob.Convenio.csproj deleted file mode 100644 index ee657eb..0000000 --- a/Sicoob.Convenio/Sicoob.Convenio.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - net9.0 - enable - enable - - - - - True - \ - - - - - - - - - - - - diff --git a/Sicoob.Convenio/SicoobConvenio.cs b/Sicoob.Convenio/SicoobConvenio.cs deleted file mode 100644 index a11af33..0000000 --- a/Sicoob.Convenio/SicoobConvenio.cs +++ /dev/null @@ -1,66 +0,0 @@ -/****************************************************************\ - * Biblioteca C# para APIs de Convenio Cobrança do SICOOB * - * Autor: Alcenir Moretto * - * https://github.com/Alcenir/SicoobAPI/Sicoob.Cobranca * -\****************************************************************/ -namespace Sicoob.Convenio; - -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 Convênios do Sicoob -/// -public sealed class SicoobConvenio : Shared.Sicoob -{ - // Documentações - // > APIs tipo "Swagger": - // https://developers.sicoob.com.br/#!/apis - - private readonly int numeroContrato; - private ClientInfo clientApi; - private ConfiguracaoAPI ConfigApi { get; } - - public SicoobConvenio(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); - } - - /* Optantes */ - public async Task IncluirBoletos(IncluirOptanteRequest boleto) - { - return await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos", boleto)); - } -} From 77beecb9046eeeea29fab3f7eb28b2388d99ccbc Mon Sep 17 00:00:00 2001 From: Alcenir Moretto Date: Sat, 25 Oct 2025 15:59:47 -0300 Subject: [PATCH 6/8] =?UTF-8?q?#Ajustes=20movimenta=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sicoob.Cobranca/Models/v3/MovimentacaoRequest.cs | 5 +++++ Sicoob.Cobranca/SicoobCobrancaV3.cs | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Sicoob.Cobranca/Models/v3/MovimentacaoRequest.cs b/Sicoob.Cobranca/Models/v3/MovimentacaoRequest.cs index 74e82c4..53d3f7a 100644 --- a/Sicoob.Cobranca/Models/v3/MovimentacaoRequest.cs +++ b/Sicoob.Cobranca/Models/v3/MovimentacaoRequest.cs @@ -1,4 +1,5 @@ using System; +using Newtonsoft.Json; namespace Sicoob.Cobranca.Models.v3; @@ -9,6 +10,10 @@ public class MovimentacaoRequest /// 1. Entrada 2. Prorrogação 3. A Vencer 4. Vencido 5. Liquidação 6. Baixa /// public int tipoMovimento { get; set; } + + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataInicial { get; set; } + + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataFinal { get; set; } } \ No newline at end of file diff --git a/Sicoob.Cobranca/SicoobCobrancaV3.cs b/Sicoob.Cobranca/SicoobCobrancaV3.cs index c47a8f2..8d78589 100644 --- a/Sicoob.Cobranca/SicoobCobrancaV3.cs +++ b/Sicoob.Cobranca/SicoobCobrancaV3.cs @@ -157,7 +157,7 @@ public async Task BaixarBoletos(int nossoNumero, int codigoModalidade) numeroCliente = numeroContrato, codigoModalidade = codigoModalidade }; - await ExecutaChamadaAsync(() => clientApi.PatchAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/baixar", baixa)); + await ExecutaChamadaAsync(() => clientApi.PostAsync(ConfigApi.UrlApi + $"cobranca-bancaria/v3/boletos/{nossoNumero}/baixar", baixa)); } public async Task AlterarBoleto(int nossoNumero, AlterarBoletoRequest boletos) @@ -234,7 +234,7 @@ private async Task SolicitarMovimentaca 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 }); + var result = await clientApi.GetAsync>(ConfigApi.UrlApi + "cobranca-bancaria/v3/boletos/movimentacoes", new { numeroCliente = numeroContrato, codigoSolicitacao }); if (result.IsSuccessStatusCode) return result.Data.resultado; @@ -253,9 +253,10 @@ private async Task SolicitarMovimentaca 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 })); + 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(); From 84971e28316689ca760aa31485d01eb51460d931 Mon Sep 17 00:00:00 2001 From: Alcenir Moretto Date: Tue, 28 Oct 2025 22:09:45 -0300 Subject: [PATCH 7/8] =?UTF-8?q?#Mapeado=20webhook=20callback=20movimento?= =?UTF-8?q?=207=20cobran=C3=A7a=20banc=C3=A1ria=20v3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sicoob.Cobranca/Models/v3/WebhookCallback.cs | 38 ++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Sicoob.Cobranca/Models/v3/WebhookCallback.cs diff --git a/Sicoob.Cobranca/Models/v3/WebhookCallback.cs b/Sicoob.Cobranca/Models/v3/WebhookCallback.cs new file mode 100644 index 0000000..254f357 --- /dev/null +++ b/Sicoob.Cobranca/Models/v3/WebhookCallback.cs @@ -0,0 +1,38 @@ +using System; + +namespace Sicoob.Cobranca.Models.v3; + +public class WebhookCallback +{ + public int idWebhook { get; set; } + public int tipoMovimento { get; set; } + public WebhookDadosCallback dados { get; set; } +} + +public class WebhookDadosCallback +{ + public string numeroIdentificadorBaixa { get; set; } + public string codigoBarrasBoleto { get; set; } + public string codigoBarrasBaixa { get; set; } + public string nossoNumero { get; set; } + public string seuNumero { get; set; } + public string codigoBancoRecebedor { get; set; } + public int codigoAgenciaRecebedora { get; set; } + public int numeroCliente { get; set; } + public string cpfCnpjBeneficiario { get; set; } + public string codigoTipoPessoaPagador { get; set; } + public string cpfCnpjPagador { get; set; } + public string nomePagador { get; set; } + public string codigoTipoPessoaPortador { get; set; } + public string cpfCnpjPortador { get; set; } + public string nomePortador { get; set; } + public decimal valorBoleto { get; set; } + public decimal valorPagamento { get; set; } + public int codigoCanalPagamento { get; set; } + public DateTime dataEmissao { get; set; } + public DateTime dataVencimento { get; set; } + public DateTime? dataLimitePagamento { get; set; } + public DateTime dataHoraSituacaoBaixa { get; set; } + public bool baixaRealizadaEmContingencia { get; set; } + public bool cancelamentoBaixa { get; set; } +} \ No newline at end of file From 51b0d4e386ce255a2c4658f75ef7262b457266b1 Mon Sep 17 00:00:00 2001 From: Alcenir Moretto Date: Sat, 6 Dec 2025 13:48:35 -0300 Subject: [PATCH 8/8] =?UTF-8?q?#CustomDateTimeConverter=20em=20propriedade?= =?UTF-8?q?s=20DateTime=20para=20altera=C3=A7=C3=A3o=20de=20boletos.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sicoob.Cobranca/Models/v3/AlterarBoletoRequest.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Sicoob.Cobranca/Models/v3/AlterarBoletoRequest.cs b/Sicoob.Cobranca/Models/v3/AlterarBoletoRequest.cs index c754896..15cf6b1 100644 --- a/Sicoob.Cobranca/Models/v3/AlterarBoletoRequest.cs +++ b/Sicoob.Cobranca/Models/v3/AlterarBoletoRequest.cs @@ -46,11 +46,22 @@ public class SeuNumero public class Desconto { public int tipoDesconto { get; set; } + + [JsonConverter(typeof(CustomDateTimeConverter))] 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; } } @@ -62,6 +73,7 @@ public class Abatimento public class Multa { public int tipoMulta { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataMulta { get; set; } public decimal valorMulta { get; set; } } @@ -69,6 +81,7 @@ public class Multa public class JurosMora { public int tipoJurosMora { get; set; } + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataJurosMora { get; set; } public decimal valorJurosMora { get; set; } } @@ -103,11 +116,13 @@ public class Pix public class ProrrogacaoVencimento { + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataVencimento { get; set; } } public class ProrrogacaoLimitePagamento { + [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime dataLimitePagamento { get; set; } }