using System.Collections.Generic;
using System.Text.RegularExpressions;
public static class Program
private const string MSG_ERRO_PARCEIRO = "Houve uma falha no processamento do pagamento de sua guia por parte do nosso parceiro de pagamento";
private const string CONTATO_SUPORTE = "Por gentileza, entre em contato com o nosso suporte para solicitar o reprocessamento e efetuar o pagamento.";
public static void Main()
var ERRONORMAL = "INSERIR ERRO DE PAGAMENTO";
Console.WriteLine(ERRONORMAL.FormatarMensagemErroRetornoPagamento());
public static string FormatarMensagemErroRetornoPagamento(this string mensagem)
var formatadores = new Dictionary<string, Func<string, string>>()
{ "Erro na API do BB.", ErroGenericoParceiroPagamento },
{ "FALHA NA COMUNIC COM A INSTITUICAO", ErroGenericoParceiroPagamento },
{ "CircuitBreaker", ErroGenericoParceiroPagamento },
{ "Server Error", ErroGenericoParceiroPagamento },
{ "Saldo insuficiente", FormatarSaldoInsuficiente },
{ "Communication Failure with CIP", FormatarUFNaoAtendida },
{ "Convênio não cadastrado", FormatarUFNaoAtendida },
{ "Convênio não está ativo", FormatarUFNaoAtendida },
{ "CEDENTE NAO AUTORIZADO", FormatarUFNaoAtendida },
{ "Inappropriate use of typeableLine", FormatarErroLeituraCodigoBarras },
{ "Transaction already exists", FormatarPagamentoJaEfetuado },
{ "Pagamento ja efetuado", FormatarPagamentoJaEfetuado },
{ "Pagamento não permitido para esse vencimento", FormatarDataInvalida },
{ "Missing required parameter", FormatarErroGuiaInvalida },
{ "Valor da operacao divergente do codigo de barras", FormatarErroLeituraCodigoBarras },
{ "Transaction has expired", FormatarErroGuiaVencida },
{ "Data de liquidacao posterior a data de vencimento", FormatarErroGuiaVencida },
{ "Object reference not set to an instance of an object", FormatarErroGuiaInvalida },
{ "The value cannot be null or empty", FormatarErroGuiaInvalida }
foreach (var formato in formatadores)
if (mensagem.Contains(formato.Key))
return formato.Value(mensagem);
private static string ErroGenerico() =>
$"Houve uma falha no processamento do pagamento de sua guia. {CONTATO_SUPORTE}";
private static string ErroGenericoParceiroPagamento(this string mensagem) =>
$"{MSG_ERRO_PARCEIRO}. {CONTATO_SUPORTE}";
private static string FormatarSaldoInsuficiente(this string mensagem) =>
"O pagamento da sua guia não foi processado devido à falta de saldo. Por gentileza, adicione saldo à sua conta.";
private static string FormatarUFNaoAtendida(this string mensagem) =>
$"{MSG_ERRO_PARCEIRO}, devido a UF informada não estar habilitada para pagamento. Por gentileza, entre em contato com nosso suporte.";
private static string FormatarErroLeituraCodigoBarras(this string mensagem) =>
"Houve uma falha no processamento do pagamento de sua guia devido o código de barras apresentado ser inválido. Por gentileza, entre em contato com nosso suporte e solicite a reemissão de sua guia.";
private static string FormatarPagamentoJaEfetuado(this string mensagem) =>
"Já existe uma solicitação de pagamento efetuada para esse código de barras. Por gentileza, entre em contato com nosso suporte.";
private static string FormatarDataInvalida(this string mensagem)
var dataVencimento = mensagem.ExtrairCorrespondencia(true, @"Data de Vencimento identificada '(.*?)', Data de Pagamento");
return $"Houve uma falha no processamento do pagamento de sua guia devido a data para pagamento informada ser superior a data de vencimento da guia, a data para pagamento deverá ser '{dataVencimento}'. {CONTATO_SUPORTE}";
private static string FormatarErroGuiaInvalida(this string mensagem) =>
"Houve uma falha no processamento do pagamento de sua guia devido erro na geração. Por gentileza, entre em contato com nosso suporte e solicite a reemissão de sua guia.";
private static string FormatarErroGuiaVencida(this string mensagem) =>
"Houve uma falha no processamento do pagamento de sua guia devido a mesma estar vencida. Por gentileza, entre em contato com nosso suporte e solicite a reemissão de sua guia.";
public static string ExtrairCorrespondencia(this string mensagem, bool valorEspecifico, params string[] padroes)
foreach (var padrao in padroes)
var match = Regex.Match(mensagem, padrao);
return valorEspecifico ? match.Groups[1].Value : match.Value;