diff --git a/Sicoob.Cobranca/SicoobCobranca.cs b/Sicoob.Cobranca/SicoobCobranca.cs index 75eafc8..08ca0ce 100644 --- a/Sicoob.Cobranca/SicoobCobranca.cs +++ b/Sicoob.Cobranca/SicoobCobranca.cs @@ -3,37 +3,36 @@ * Autor: Rafael Estevam * * gh/SharpSistemas/SicoobAPI * \**************************************/ +namespace Sicoob.Cobranca; + using Sicoob.Shared.Models.Acesso; using Simple.API; using System.Net.Http; -namespace Sicoob.Cobranca +public sealed class SicoobCobranca : Shared.Sicoob { - public sealed class SicoobCobranca : Shared.Sicoob - { - // Documentações - // > APIs tipo "Swagger": - // https://developers.sicoob.com.br/#!/apis - - private ClientInfo clientApi; - public Shared.Models.ConfiguracaoAPI ConfigApi { get; } + // Documentações + // > APIs tipo "Swagger": + // https://developers.sicoob.com.br/#!/apis - public SicoobCobranca(Shared.Models.ConfiguracaoAPI configApi) - : base(configApi) - { - ConfigApi = configApi; - } + private ClientInfo clientApi; + public Shared.Models.ConfiguracaoAPI ConfigApi { get; } - protected override void setupClients(HttpClientHandler handler) - { - clientApi = new ClientInfo(ConfigApi.UrlApi, handler); - clientApi.SetHeader("x-sicoob-clientid", ConfigApi.ClientId); - } + public SicoobCobranca(Shared.Models.ConfiguracaoAPI configApi) + : base(configApi) + { + ConfigApi = configApi; + } - protected override void atualizaClients(TokenResponse token) - { - clientApi.SetAuthorizationBearer(token.access_token); - } + protected override void setupClients(HttpClientHandler handler) + { + clientApi = new ClientInfo(ConfigApi.UrlApi, handler); + clientApi.SetHeader("x-sicoob-clientid", ConfigApi.ClientId); + } + protected override void atualizaClients(TokenResponse token) + { + clientApi.SetAuthorizationBearer(token.access_token); } + } diff --git a/Sicoob.Conta/SicoobContaCorrente.cs b/Sicoob.Conta/SicoobContaCorrente.cs index 4457354..217459d 100644 --- a/Sicoob.Conta/SicoobContaCorrente.cs +++ b/Sicoob.Conta/SicoobContaCorrente.cs @@ -3,66 +3,65 @@ * Autor: Rafael Estevam * * gh/SharpSistemas/SicoobAPI * \**************************************/ +namespace Sicoob.Conta; + using Sicoob.Conta.Models; using Sicoob.Shared.Models.Acesso; using Simple.API; using System.Net.Http; using System.Threading.Tasks; -namespace Sicoob.Conta +public sealed class SicoobContaCorrente : Shared.Sicoob { - public sealed class SicoobContaCorrente : Shared.Sicoob - { - // Documentações - // > APIs tipo "Swagger": - // https://developers.sicoob.com.br/#!/apis + // Documentações + // > APIs tipo "Swagger": + // https://developers.sicoob.com.br/#!/apis - private ClientInfo clientApi; - public Shared.Models.ConfiguracaoAPI ConfigApi { get; } + private ClientInfo clientApi; + public Shared.Models.ConfiguracaoAPI ConfigApi { get; } - public SicoobContaCorrente(Shared.Models.ConfiguracaoAPI configApi, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) - : base(configApi, certificado) - { - ConfigApi = configApi; - } + public SicoobContaCorrente(Shared.Models.ConfiguracaoAPI configApi, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) + : base(configApi, certificado) + { + ConfigApi = configApi; + } - protected override void setupClients(HttpClientHandler handler) - { - clientApi = new ClientInfo(ConfigApi.UrlApi, handler); - clientApi.SetHeader("x-sicoob-clientid", ConfigApi.ClientId); + protected override void setupClients(HttpClientHandler handler) + { + clientApi = new ClientInfo(ConfigApi.UrlApi, handler); + clientApi.SetHeader("x-sicoob-clientid", ConfigApi.ClientId); #if DEBUG - enableDebug(clientApi); + enableDebug(clientApi); #endif - } - protected override void atualizaClients(TokenResponse token) - { - clientApi.SetAuthorizationBearer(token.id_token); - } + } + protected override void atualizaClients(TokenResponse token) + { + clientApi.SetAuthorizationBearer(token.id_token); + } - /// - /// O recurso de Saldo retorna o valor disponível atual e o limite de crédito (cheque especial) de uma conta corrente. - /// - public async Task> ObterSaldoAsync() - => await ExecutaChamadaAsync(() => clientApi.GetAsync>("/conta-corrente/v2/saldo")); - /// - /// O recurso de Saldo retorna o valor disponível atual e o limite de crédito (cheque especial) de uma conta corrente. - /// - public async Task> ObterSaldoAsync(string numeroContaCorrente) - => await ExecutaChamadaAsync(() => clientApi.GetAsync>("/conta-corrente/v2/saldo", new { numeroContaCorrente })); - - /// - /// O recurso de Extrato retorna todas as transações ocorridas em uma conta corrente no devido mês e ano. - /// Há um limite de 3 meses - /// - public async Task> ObterExtratoAsync(int mes, int ano) - => await ExecutaChamadaAsync(() => clientApi.GetAsync>($"/conta-corrente/v2/extrato/{mes}/{ano}")); - /// - /// O recurso de Extrato retorna todas as transações ocorridas em uma conta corrente no devido mês e ano. - /// Há um limite de 3 meses - /// - public async Task> ObterExtratoAsync(int mes, int ano, string numeroContaCorrente) - => await ExecutaChamadaAsync(() => clientApi.GetAsync>($"/conta-corrente/v2/extrato/{mes}/{ano}", new { numeroContaCorrente })); + /// + /// O recurso de Saldo retorna o valor disponível atual e o limite de crédito (cheque especial) de uma conta corrente. + /// + public async Task> ObterSaldoAsync() + => await ExecutaChamadaAsync(() => clientApi.GetAsync>("/conta-corrente/v2/saldo")); + /// + /// O recurso de Saldo retorna o valor disponível atual e o limite de crédito (cheque especial) de uma conta corrente. + /// + public async Task> ObterSaldoAsync(string numeroContaCorrente) + => await ExecutaChamadaAsync(() => clientApi.GetAsync>("/conta-corrente/v2/saldo", new { numeroContaCorrente })); + + /// + /// O recurso de Extrato retorna todas as transações ocorridas em uma conta corrente no devido mês e ano. + /// Há um limite de 3 meses + /// + public async Task> ObterExtratoAsync(int mes, int ano) + => await ExecutaChamadaAsync(() => clientApi.GetAsync>($"/conta-corrente/v2/extrato/{mes}/{ano}")); + /// + /// O recurso de Extrato retorna todas as transações ocorridas em uma conta corrente no devido mês e ano. + /// Há um limite de 3 meses + /// + public async Task> ObterExtratoAsync(int mes, int ano, string numeroContaCorrente) + => await ExecutaChamadaAsync(() => clientApi.GetAsync>($"/conta-corrente/v2/extrato/{mes}/{ano}", new { numeroContaCorrente })); - } } diff --git a/Sicoob.Conta/SicoobContaPoupanca.cs b/Sicoob.Conta/SicoobContaPoupanca.cs index c531b1e..c4cb5d7 100644 --- a/Sicoob.Conta/SicoobContaPoupanca.cs +++ b/Sicoob.Conta/SicoobContaPoupanca.cs @@ -3,53 +3,52 @@ * Autor: Rafael Estevam * * gh/SharpSistemas/SicoobAPI * \**************************************/ +namespace Sicoob.Conta; + using Sicoob.Shared.Models.Acesso; using Simple.API; using System.Net.Http; using System.Threading.Tasks; -namespace Sicoob.Conta +public sealed class SicoobContaPoupanca : Shared.Sicoob { - public sealed class SicoobContaPoupanca : Shared.Sicoob - { - // Documentações - // > APIs tipo "Swagger": - // https://developers.sicoob.com.br/#!/apis + // Documentações + // > APIs tipo "Swagger": + // https://developers.sicoob.com.br/#!/apis - private ClientInfo clientApi; - public Shared.Models.ConfiguracaoAPI ConfigApi { get; } + private ClientInfo clientApi; + public Shared.Models.ConfiguracaoAPI ConfigApi { get; } - public SicoobContaPoupanca(Shared.Models.ConfiguracaoAPI configApi, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) - : base(configApi, certificado) - { - ConfigApi = configApi; - } + public SicoobContaPoupanca(Shared.Models.ConfiguracaoAPI configApi, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) + : base(configApi, certificado) + { + ConfigApi = configApi; + } - protected override void setupClients(HttpClientHandler handler) - { - clientApi = new ClientInfo(ConfigApi.UrlApi, handler); - clientApi.SetHeader("x-sicoob-clientid", ConfigApi.ClientId); - } - protected override void atualizaClients(TokenResponse token) - { - clientApi.SetAuthorizationBearer(token.access_token); - } + protected override void setupClients(HttpClientHandler handler) + { + clientApi = new ClientInfo(ConfigApi.UrlApi, handler); + clientApi.SetHeader("x-sicoob-clientid", ConfigApi.ClientId); + } + protected override void atualizaClients(TokenResponse token) + { + clientApi.SetAuthorizationBearer(token.access_token); + } - /// - /// Pesquisa as contas de poupança que pertencem a um CPF ou CNPJ. - /// - public async Task ListarContasAsync() - => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/poupanca/v1/contas")); - /// - /// Consulta o extrato de um mês e ano de uma conta poupança. - /// - public async Task ObterSaldoAsync(string contaPoupanca) - => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/poupanca/v1/contas/{contaPoupanca}/saldo")); - /// - /// Consulta o saldo atual de uma conta poupança. - /// - public async Task ObterExtratoAsync(int mes, int ano, string contaPoupanca) - => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/poupanca/v1/contas/{contaPoupanca}/extrato/{mes}/{ano}")); + /// + /// Pesquisa as contas de poupança que pertencem a um CPF ou CNPJ. + /// + public async Task ListarContasAsync() + => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/poupanca/v1/contas")); + /// + /// Consulta o extrato de um mês e ano de uma conta poupança. + /// + public async Task ObterSaldoAsync(string contaPoupanca) + => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/poupanca/v1/contas/{contaPoupanca}/saldo")); + /// + /// Consulta o saldo atual de uma conta poupança. + /// + public async Task ObterExtratoAsync(int mes, int ano, string contaPoupanca) + => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/poupanca/v1/contas/{contaPoupanca}/extrato/{mes}/{ano}")); - } } diff --git a/Sicoob.PIX/SicoobConsultaPayload.cs b/Sicoob.PIX/SicoobConsultaPayload.cs index 5359d10..3bef9b8 100644 --- a/Sicoob.PIX/SicoobConsultaPayload.cs +++ b/Sicoob.PIX/SicoobConsultaPayload.cs @@ -3,44 +3,43 @@ * Autor: Rafael Estevam * * gh/SharpSistemas/SicoobAPI * \**************************************/ +namespace Sicoob.PIX; + using Simple.API; using System.Threading.Tasks; -namespace Sicoob.PIX +/// +/// Consulta os endpoints abertos (Sem autenticação) +/// +public class SicoobConsultaPayload { + private readonly ClientInfo clientApi; + private readonly ClientInfo clientPix; + public SicoobConsultaPayload() + { + clientApi = new ClientInfo("https://api.sicoob.com.br/pix/api/v2/"); + clientPix = new ClientInfo("https://pix.sicoob.com.br"); + } /// - /// Consulta os endpoints abertos (Sem autenticação) + /// Consulta um Location /// - public class SicoobConsultaPayload + /// JWT contendo os dados do PIX + public async Task ConsultaCobPayloadAsync(string urlAcessToken) { - private readonly ClientInfo clientApi; - private readonly ClientInfo clientPix; - public SicoobConsultaPayload() - { - clientApi = new ClientInfo("https://api.sicoob.com.br/pix/api/v2/"); - clientPix = new ClientInfo("https://pix.sicoob.com.br"); - } - /// - /// Consulta um Location - /// - /// JWT contendo os dados do PIX - public async Task ConsultaCobPayloadAsync(string urlAcessToken) - { - var response = await clientApi.GetAsync(urlAcessToken); - response.EnsureSuccessStatusCode(); - return response.Data; - } - /// - /// Consulta campo payloadURL do PIX - /// - /// JWT contendo os dados do PIX - public async Task ConsultaPixPayloadUrlAsync(string url) - { - url = url.Substring(url.IndexOf("/") + 1); - var response = await clientPix.GetAsync(url); - response.EnsureSuccessStatusCode(); - return response.Data; - } - + var response = await clientApi.GetAsync(urlAcessToken); + response.EnsureSuccessStatusCode(); + return response.Data; } + /// + /// Consulta campo payloadURL do PIX + /// + /// JWT contendo os dados do PIX + public async Task ConsultaPixPayloadUrlAsync(string url) + { + url = url.Substring(url.IndexOf("/") + 1); + var response = await clientPix.GetAsync(url); + response.EnsureSuccessStatusCode(); + return response.Data; + } + } diff --git a/Sicoob.PIX/SicoobPIX.cs b/Sicoob.PIX/SicoobPIX.cs index 168740c..4028cad 100644 --- a/Sicoob.PIX/SicoobPIX.cs +++ b/Sicoob.PIX/SicoobPIX.cs @@ -3,6 +3,8 @@ * Autor: Rafael Estevam * * gh/SharpSistemas/SicoobAPI * \**************************************/ +namespace Sicoob.PIX; + using CS.BCB.PIX.Contratos; using CS.BCB.PIX.Models; using Sicoob.Shared; @@ -12,251 +14,248 @@ using System.Globalization; using System.Threading.Tasks; -namespace Sicoob.PIX +/// +/// Classe para comunicação com as APIs de PIX do Sicoob +/// +public sealed class SicoobPIX : Shared.Sicoob, IApiPix { - /// - /// Classe para comunicação com as APIs de PIX do Sicoob - /// - public sealed class SicoobPIX : Shared.Sicoob, IApiPix - { - // Documentações - // > APIs tipo "Swagger": - // https://developers.sicoob.com.br/#!/apis - // > APIs no POSTMAN: - // https://documenter.getpostman.com/view/20565799/UzBnrmod#239d9f68-d646-4209-994a-cd564b6d6d1a - // Auxiliares - // > Parseia BR Code para debugar: - // https://openpix.com.br/qrcode/scanner/ - // > Gera QR para teste: - // https://webqr.com/create.html + // Documentações + // > APIs tipo "Swagger": + // https://developers.sicoob.com.br/#!/apis + // > APIs no POSTMAN: + // https://documenter.getpostman.com/view/20565799/UzBnrmod#239d9f68-d646-4209-994a-cd564b6d6d1a + // Auxiliares + // > Parseia BR Code para debugar: + // https://openpix.com.br/qrcode/scanner/ + // > Gera QR para teste: + // https://webqr.com/create.html - private ClientInfo clientApi; - public Shared.Models.ConfiguracaoAPI ConfigApi { get; } + private ClientInfo clientApi; + public Shared.Models.ConfiguracaoAPI ConfigApi { get; } - public SicoobPIX(Shared.Models.ConfiguracaoAPI configApi, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) - : base(configApi, certificado) - { - ConfigApi = configApi; - } + public SicoobPIX(Shared.Models.ConfiguracaoAPI configApi, System.Security.Cryptography.X509Certificates.X509Certificate2? certificado = null) + : base(configApi, certificado) + { + ConfigApi = configApi; + } - protected override void setupClients(System.Net.Http.HttpClientHandler handler) - { - clientApi = new ClientInfo(ConfigApi.UrlApi, handler); - clientApi.SetHeader("x-sicoob-clientid", ConfigApi.ClientId); + protected override void setupClients(System.Net.Http.HttpClientHandler handler) + { + clientApi = new ClientInfo(ConfigApi.UrlApi, handler); + clientApi.SetHeader("x-sicoob-clientid", ConfigApi.ClientId); #if DEBUG - enableDebug(clientApi); + enableDebug(clientApi); #endif - } - protected override void atualizaClients(TokenResponse token) - { - clientApi.SetAuthorizationBearer(token.access_token); - } - - /* COB */ - /// - /// Endpoint que cria uma cobrança imediata (QRCode Pix). - /// - /// String, deve ter de 27 a 36 caracteres. Identificador único da cobrança Pix - /// Dados para geração da cobrança imediata. - /// Cobrança imediata criada - public async Task CriarCobrancaAsync(string transactionId, NovaCobrancaImediata cobranca) - { - validaTxID(transactionId); - return await ExecutaChamadaAsync(() => clientApi.PutAsync($"/pix/api/v2/cob/{transactionId}", cobranca)); - } - /// - /// Endpoint para criar uma cobrança imediata, neste caso, o txid deve ser definido pelo PSP. - /// - /// Dados para geração da cobrança imediata. - /// Cobrança imediata criada - public async Task CriarCobrancaAsync(NovaCobrancaImediata cobranca) - => await ExecutaChamadaAsync(() => clientApi.PostAsync($"/pix/api/v2/cob", cobranca)); - /// - /// Endpoint para revisar uma cobrança através de um determinado txid. - /// - /// String, deve ter de 27 a 36 caracteres. Identificador único da cobrança Pix. - /// Dados para geração da cobrança - /// Cobrança imediata revisada. A revisão deve ser incrementada em 1. - public async Task RevisarCobrancaAsync(string transactionId, RevisarCobrancaImediata cobranca) - { - validaTxID(transactionId); - return await ExecutaChamadaAsync(() => clientApi.PatchAsync($"/pix/api/v2/cob/{transactionId}", cobranca)); - } - - /// - /// Endpoint para consultar uma cobrança através de um determinado txid. - /// - /// String, deve ter de 27 a 36 caracteres. Identificador único da cobrança Pix. - /// Revisao a ser consultada - /// Dados da cobrança imediata - public async Task ConsultarCobrancaAsync(string transactionId, int? revisao = null) - { - validaTxID(transactionId); + } + protected override void atualizaClients(TokenResponse token) + { + clientApi.SetAuthorizationBearer(token.access_token); + } - string url = $"/pix/api/v2/cob/{transactionId}"; - if (revisao.HasValue) url += $"?revisao={revisao.Value}"; + /* COB */ + /// + /// Endpoint que cria uma cobrança imediata (QRCode Pix). + /// + /// String, deve ter de 27 a 36 caracteres. Identificador único da cobrança Pix + /// Dados para geração da cobrança imediata. + /// Cobrança imediata criada + public async Task CriarCobrancaAsync(string transactionId, NovaCobrancaImediata cobranca) + { + validaTxID(transactionId); + return await ExecutaChamadaAsync(() => clientApi.PutAsync($"/pix/api/v2/cob/{transactionId}", cobranca)); + } + /// + /// Endpoint para criar uma cobrança imediata, neste caso, o txid deve ser definido pelo PSP. + /// + /// Dados para geração da cobrança imediata. + /// Cobrança imediata criada + public async Task CriarCobrancaAsync(NovaCobrancaImediata cobranca) + => await ExecutaChamadaAsync(() => clientApi.PostAsync($"/pix/api/v2/cob", cobranca)); + /// + /// Endpoint para revisar uma cobrança através de um determinado txid. + /// + /// String, deve ter de 27 a 36 caracteres. Identificador único da cobrança Pix. + /// Dados para geração da cobrança + /// Cobrança imediata revisada. A revisão deve ser incrementada em 1. + public async Task RevisarCobrancaAsync(string transactionId, RevisarCobrancaImediata cobranca) + { + validaTxID(transactionId); + return await ExecutaChamadaAsync(() => clientApi.PatchAsync($"/pix/api/v2/cob/{transactionId}", cobranca)); + } - return await ExecutaChamadaAsync(() => clientApi.GetAsync(url)); - } - /// - /// Endpoint para consultar cobranças imediatas através de parâmetros como início, fim, cpf, cnpj e status. - /// - /// Dados da consulta - /// Lista de cobranças imediatas. - public async Task ListarCobrancasAsync(ConsultarCobrancaImediata consulta) - => await ExecutaChamadaAsync(() => clientApi.GetAsync("/pix/api/v2/cob", consulta.ToKVP())); + /// + /// Endpoint para consultar uma cobrança através de um determinado txid. + /// + /// String, deve ter de 27 a 36 caracteres. Identificador único da cobrança Pix. + /// Revisao a ser consultada + /// Dados da cobrança imediata + public async Task ConsultarCobrancaAsync(string transactionId, int? revisao = null) + { + validaTxID(transactionId); - /// - /// Endpoint para gerar a imagem qrcode de uma cobrança através de um determinado txid. - /// - /// String, deve ter de 27 a 36 caracteres. Identificador único da cobrança Pix. - /// Revisao a ser consultada - /// Largura da imagem a ser exibida - /// Bytes da imagem codificada em PNG - [Obsolete("Sicoob removeu o endpoint", true)] - public async Task ConsultarImagemCobrancaAsync(string transactionId, int? revisao = null, int? largura = null) - { - validaTxID(transactionId); - string url = $"/pix/api/v2/cob/{transactionId}/imagem"; + string url = $"/pix/api/v2/cob/{transactionId}"; + if (revisao.HasValue) url += $"?revisao={revisao.Value}"; - return await ExecutaChamadaAsync(() => clientApi.GetAsync(url, new { revisao, largura }.ToKVP())); - } + return await ExecutaChamadaAsync(() => clientApi.GetAsync(url)); + } + /// + /// Endpoint para consultar cobranças imediatas através de parâmetros como início, fim, cpf, cnpj e status. + /// + /// Dados da consulta + /// Lista de cobranças imediatas. + public async Task ListarCobrancasAsync(ConsultarCobrancaImediata consulta) + => await ExecutaChamadaAsync(() => clientApi.GetAsync("/pix/api/v2/cob", consulta.ToKVP())); - /* COBV */ + /// + /// Endpoint para gerar a imagem qrcode de uma cobrança através de um determinado txid. + /// + /// String, deve ter de 27 a 36 caracteres. Identificador único da cobrança Pix. + /// Revisao a ser consultada + /// Largura da imagem a ser exibida + /// Bytes da imagem codificada em PNG + [Obsolete("Sicoob removeu o endpoint", true)] + public async Task ConsultarImagemCobrancaAsync(string transactionId, int? revisao = null, int? largura = null) + { + validaTxID(transactionId); + string url = $"/pix/api/v2/cob/{transactionId}/imagem"; - /* COBV-Lote */ + return await ExecutaChamadaAsync(() => clientApi.GetAsync(url, new { revisao, largura }.ToKVP())); + } - /* PayloadLocation */ + /* COBV */ - /* PIX */ - /// - /// Endpoint para consultar Pix recebidos - /// - /// Dados da consulta - /// Lista dos Pix recebidos de acordo com o critério de busca. - public async Task ListarPIXAsync(ConsultarPix consulta) - => await ExecutaChamadaAsync(() => clientApi.GetAsync("/pix/api/v2/pix", consulta.ToKVP())); - /// - /// Endpoint para consultar um Pix através de um e2eid. - /// - /// Id fim a fim da transação. Deve ter 32 caracteres. - /// Dados do Pix efetuado. - public async Task ConsultarPIXAsync(string endToEndId) - => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/pix/api/v2/pix/{endToEndId}")); + /* COBV-Lote */ - /// - /// Endpoint para solicitar uma devolução através de um e2eid do Pix e do ID da devolução. - /// O motivo que será atribuído à PACS.004 será "Devolução solicitada pelo usuário recebedor do pagamento original" - /// cuja sigla é "MD06" de acordo com a aba RTReason da PACS.004 que consta no Catálogo de Mensagens do Pix. - /// - /// Id fim a fim da transação. - /// Id gerado pelo cliente para representar unicamente uma devolução. - /// Valor a ser devolvido - /// Dados da devolução - public async Task SolicitarDevlucaoPixAsync(string endToEndId, string idDevolucao, decimal valor) - { - validaIDDevolucao(idDevolucao); - string url = $"/pix/api/v2/pix/{endToEndId}/devolucao/{idDevolucao}"; - return await ExecutaChamadaAsync(() => clientApi.PutAsync(url, new { valor = valor.ToString("N2", CultureInfo.InvariantCulture) })); - } - /// - /// Endpoint para consultar uma devolução através de um EndToEndID do Pix e do ID da devolução - /// - /// Id fim a fim da transação. - /// Id gerado pelo cliente para representar unicamente uma devolução. - /// Dados da devolução - public async Task ConsultarDevlucaoPixAsync(string endToEndId, string idDevolucao) - { - string url = $"/pix/api/v2/pix/{endToEndId}/devolucao/{idDevolucao}"; - return await ExecutaChamadaAsync(() => clientApi.GetAsync(url)); - } + /* PayloadLocation */ - /* Webhook */ - /// - /// Endpoint para configuração do serviço de notificações acerca de Pix recebidos. - /// Somente Pix associados a um txid serão notificados. - /// - /// Chave a ser associada - /// Url a ser chamada com POST. Será concatenado `/pix` ao final. - public async Task CriarWebHookAsync(string chave, string url) - { - await ExecutaChamadaAsync(() => clientApi.PutAsync($"/pix/api/v2/webhook/{chave}", new { webhookUrl = url })); - } - /// - /// Endpoint para consultar Webhooks cadastrados - /// - public async Task ConsultarWebHooksAsync() - => await ExecutaChamadaAsync(() => clientApi.GetAsync("/pix/api/v2/webhook")); - /// - /// Endpoint para recuperação de informações sobre o Webhook Pix. - /// - public async Task ConsultarWebHookAsync(string chave) - => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/pix/api/v2/webhook/{chave}")); - /// - /// Endpoint para cancelamento do webhook. Não é a única forma pela qual um webhook pode ser removido. - /// - public async Task CancelarWebHookAsync(string chave) - => await ExecutaChamadaAsync(() => clientApi.DeleteAsync($"/pix/api/v2/webhook/{chave}")); + /* PIX */ + /// + /// Endpoint para consultar Pix recebidos + /// + /// Dados da consulta + /// Lista dos Pix recebidos de acordo com o critério de busca. + public async Task ListarPIXAsync(ConsultarPix consulta) + => await ExecutaChamadaAsync(() => clientApi.GetAsync("/pix/api/v2/pix", consulta.ToKVP())); + /// + /// Endpoint para consultar um Pix através de um e2eid. + /// + /// Id fim a fim da transação. Deve ter 32 caracteres. + /// Dados do Pix efetuado. + public async Task ConsultarPIXAsync(string endToEndId) + => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/pix/api/v2/pix/{endToEndId}")); - /* Validação de IDs */ - private static void validaTxID(string transactionId) - { - if (string.IsNullOrEmpty(transactionId)) - { - throw new ArgumentException($"'{nameof(transactionId)}' cannot be null or empty.", nameof(transactionId)); - } - if (!CS.BCB.PIX.Validadores.ValidacaoIdentificadores.ValidaTransactionId(transactionId)) - { - throw new ArgumentException($"'{nameof(transactionId)}' Não é valido na restrição", nameof(transactionId)); - } - } - private static void validaIDDevolucao(string idDevolucao) - { - if (string.IsNullOrEmpty(idDevolucao)) - { - throw new ArgumentException($"'{nameof(idDevolucao)}' cannot be null or empty.", nameof(idDevolucao)); - } + /// + /// Endpoint para solicitar uma devolução através de um e2eid do Pix e do ID da devolução. + /// O motivo que será atribuído à PACS.004 será "Devolução solicitada pelo usuário recebedor do pagamento original" + /// cuja sigla é "MD06" de acordo com a aba RTReason da PACS.004 que consta no Catálogo de Mensagens do Pix. + /// + /// Id fim a fim da transação. + /// Id gerado pelo cliente para representar unicamente uma devolução. + /// Valor a ser devolvido + /// Dados da devolução + public async Task SolicitarDevlucaoPixAsync(string endToEndId, string idDevolucao, decimal valor) + { + validaIDDevolucao(idDevolucao); + string url = $"/pix/api/v2/pix/{endToEndId}/devolucao/{idDevolucao}"; + return await ExecutaChamadaAsync(() => clientApi.PutAsync(url, new { valor = valor.ToString("N2", CultureInfo.InvariantCulture) })); + } + /// + /// Endpoint para consultar uma devolução através de um EndToEndID do Pix e do ID da devolução + /// + /// Id fim a fim da transação. + /// Id gerado pelo cliente para representar unicamente uma devolução. + /// Dados da devolução + public async Task ConsultarDevlucaoPixAsync(string endToEndId, string idDevolucao) + { + string url = $"/pix/api/v2/pix/{endToEndId}/devolucao/{idDevolucao}"; + return await ExecutaChamadaAsync(() => clientApi.GetAsync(url)); + } - if (!CS.BCB.PIX.Validadores.ValidacaoIdentificadores.ValidaIdDevolucao(idDevolucao)) - { - throw new ArgumentException($"'{nameof(idDevolucao)}' Não é valido na restrição", nameof(idDevolucao)); - } - } + /* Webhook */ + /// + /// Endpoint para configuração do serviço de notificações acerca de Pix recebidos. + /// Somente Pix associados a um txid serão notificados. + /// + /// Chave a ser associada + /// Url a ser chamada com POST. Será concatenado `/pix` ao final. + public async Task CriarWebHookAsync(string chave, string url) + { + await ExecutaChamadaAsync(() => clientApi.PutAsync($"/pix/api/v2/webhook/{chave}", new { webhookUrl = url })); + } + /// + /// Endpoint para consultar Webhooks cadastrados + /// + public async Task ConsultarWebHooksAsync() + => await ExecutaChamadaAsync(() => clientApi.GetAsync("/pix/api/v2/webhook")); + /// + /// Endpoint para recuperação de informações sobre o Webhook Pix. + /// + public async Task ConsultarWebHookAsync(string chave) + => await ExecutaChamadaAsync(() => clientApi.GetAsync($"/pix/api/v2/webhook/{chave}")); + /// + /// Endpoint para cancelamento do webhook. Não é a única forma pela qual um webhook pode ser removido. + /// + public async Task CancelarWebHookAsync(string chave) + => await ExecutaChamadaAsync(() => clientApi.DeleteAsync($"/pix/api/v2/webhook/{chave}")); - /* Não implementados */ - public Task ConsultarCobrancaVencimentoAsync(string transactionId, int? revisao = null) - { - throw new NotImplementedException(); - } - public Task CriarCobrancaVencimentoAsync(string transactionId, NovaCobrancaVencimento cobranca) - { - throw new NotImplementedException(); - } - public Task ListarCobrancasVencimentoAsync(ConsultarCobrancaImediata consulta) - { - throw new NotImplementedException(); - } - public Task RevisarCobrancaVencimentoAsync(string transactionId, RevisarCobrancaVencimento cobranca) - { - throw new NotImplementedException(); - } - public Task CriarLoteCobrancaVencimentoAsync(string idLote, NovaCobrancaVencimentoLote lote) + /* Validação de IDs */ + private static void validaTxID(string transactionId) + { + if (string.IsNullOrEmpty(transactionId)) { - throw new NotImplementedException(); + throw new ArgumentException($"'{nameof(transactionId)}' cannot be null or empty.", nameof(transactionId)); } - public Task RevisarLoteCobrancaVencimentoAsync(string idLote, RevisarCobrancaVencimentoLote lote) + if (!CS.BCB.PIX.Validadores.ValidacaoIdentificadores.ValidaTransactionId(transactionId)) { - throw new NotImplementedException(); + throw new ArgumentException($"'{nameof(transactionId)}' Não é valido na restrição", nameof(transactionId)); } - public Task ConsultarLoteCobrancaVencimentoAsync(string transactionId) + } + private static void validaIDDevolucao(string idDevolucao) + { + if (string.IsNullOrEmpty(idDevolucao)) { - throw new NotImplementedException(); + throw new ArgumentException($"'{nameof(idDevolucao)}' cannot be null or empty.", nameof(idDevolucao)); } - public Task ListarLoteCobrancaVencimentoAsync(Consulta consulta) + + if (!CS.BCB.PIX.Validadores.ValidacaoIdentificadores.ValidaIdDevolucao(idDevolucao)) { - throw new NotImplementedException(); + throw new ArgumentException($"'{nameof(idDevolucao)}' Não é valido na restrição", nameof(idDevolucao)); } } + + /* Não implementados */ + public Task ConsultarCobrancaVencimentoAsync(string transactionId, int? revisao = null) + { + throw new NotImplementedException(); + } + public Task CriarCobrancaVencimentoAsync(string transactionId, NovaCobrancaVencimento cobranca) + { + throw new NotImplementedException(); + } + public Task ListarCobrancasVencimentoAsync(ConsultarCobrancaImediata consulta) + { + throw new NotImplementedException(); + } + public Task RevisarCobrancaVencimentoAsync(string transactionId, RevisarCobrancaVencimento cobranca) + { + throw new NotImplementedException(); + } + public Task CriarLoteCobrancaVencimentoAsync(string idLote, NovaCobrancaVencimentoLote lote) + { + throw new NotImplementedException(); + } + public Task RevisarLoteCobrancaVencimentoAsync(string idLote, RevisarCobrancaVencimentoLote lote) + { + throw new NotImplementedException(); + } + public Task ConsultarLoteCobrancaVencimentoAsync(string transactionId) + { + throw new NotImplementedException(); + } + public Task ListarLoteCobrancaVencimentoAsync(Consulta consulta) + { + throw new NotImplementedException(); + } }