public void Processar(dynamic mensagem)
        {
            int ano = mensagem.Ano;
            if (ano < 2012 || ano > 2999)
            {
                throw new ArgumentException("O ano está fora da faixa suportada.", "mensagem");
            }

            int mes = mensagem.Mes;
            if (mes < 1 || mes > 12)
            {
                throw new ArgumentException("O mês está fora da faixa suportada.", "mensagem");
            }

            int primeiro = mensagem.Primeiro;
            if (primeiro < 1)
            {
                throw new ArgumentException("O número do primeiro contrato deve ser no mínimo 1.", "mensagem");
            }

            int ultimo = mensagem.Ultimo;
            if (ultimo < primeiro)
            {
                throw new ArgumentException("O número do último contrato deve ser maior ou igual ao primeiro.",
                                            "mensagem");
            }
            if (ultimo > Contrato.NumeroMaximoDeContrato)
            {
                throw new ArgumentException(
                    String.Format("O número do último contrato deve ser menor do que {0}.",
                                  Contrato.NumeroMaximoDeContrato),
                    "mensagem");
            }

            Guid processamentoId = mensagem.ProcessamentoId;
            if (processamentoId == Guid.Empty)
            {
                throw new ArgumentException("O identificador do processamento não foi encontrado.", "mensagem");
            }

            int quantidade = ultimo - primeiro + 1;
            if (quantidade > _quantidadeMaximaPorLote)
            {
                Trace.WriteLine(
                    String.Format("Subdividindo solicitação de faturamento para {0}/{1} dos contratos {2} a {3}.", mes, ano, primeiro, ultimo));
                int meio = (ultimo - primeiro) / 2 + primeiro;
                var gerador = new FaturamentoDeContratos();
                gerador.SolicitarFaturamento(processamentoId, ano, mes, primeiro, meio);
                gerador.SolicitarFaturamento(processamentoId, ano, mes, meio + 1, ultimo);
            }
            else
            {
                Faturar(processamentoId, ano, mes, primeiro, ultimo);
            }
        }
 public ActionResult Index(SolicitacaoDeFaturamentoModel model)
 {
     try
     {
         var faturamento = new FaturamentoDeContratos();
         faturamento.SolicitarFaturamento(model.Ano, model.Mes);
         return RedirectToAction("FaturamentoSolicitado");
     }
     catch (Exception ex)
     {
         ModelState.AddModelError("", ex.Message);
         return View();
     }
 }