/**
   * Método do 2º step-method
   *
   * @param valorFaturamento
   * @param motivo
   * @param usuario
   * @return o faturamento do prestador a ser salvo
   * @throws ValidateException
   */
  public AbstractFaturamento criarFaturamentoComAlteracao(
      AbstractFaturamento faturamento,
      BigDecimal valorFaturamentoAcres,
      BigDecimal valorFaturamentoDecres,
      String motivo,
      UsuarioInterface usuario)
      throws ValidateException {
    AlteracaoFaturamento alteracao = new AlteracaoFaturamento();
    if (valorFaturamentoAcres == null) {
      valorFaturamentoAcres = BigDecimal.ZERO;
    }

    if (valorFaturamentoDecres == null) {
      valorFaturamentoDecres = BigDecimal.ZERO;
    }

    if (valorFaturamentoAcres.compareTo(BigDecimal.ZERO) == 0
        && valorFaturamentoDecres.compareTo(BigDecimal.ZERO) == 0) {
      throw new RuntimeException("Caro usuário informe um valor.");
    }

    alteracao.setValorIncremento(valorFaturamentoAcres);
    alteracao.setValorDecremento(valorFaturamentoDecres);
    alteracao.setStatus(AlteracaoFaturamento.STATUS_ATIVO);
    alteracao.setData(new Date());
    alteracao.setMotivo(motivo);
    alteracao.setUsuario(usuario);

    if (faturamento == null) {
      if (tipo == FATURAMENTO_NORMAL) faturamento = new Faturamento();
      else faturamento = new FaturamentoPassivo();
      faturamento.setValorBruto(BigDecimal.ZERO);
      faturamento.setValorLiquido(BigDecimal.ZERO);
      faturamento.setPrestador(prestador);
      faturamento.setNome(prestador.getPessoaJuridica().getFantasia());
      faturamento.setInformacaoFinanceira(prestador.getInformacaoFinanceira());
      faturamento.setCategoria(prestador.getTipoPrestador());
      faturamento.setGeradoPosteriormente(true);
      faturamento.setMotivoGeracaoPosterior(motivo);
      faturamento.setDataGeracao(new Date());
      faturamento.setCompetencia(Utils.gerarCompetencia(competencia));
      alteracao.setFaturamento(faturamento);
      faturamento.getAlteracoesFaturamento().add(alteracao);
    } else {
      alteracao.setFaturamento(faturamento);
      faturamento.getAlteracoesFaturamento().add(alteracao);
    }

    faturamento.setValorBruto(faturamento.getValorBruto().add(alteracao.getSaldo()));

    if (faturamento.getValorBruto().compareTo(BigDecimal.ZERO) < 0) {
      throw new RuntimeException(
          "Caro usuario, o saldo das alterações não pode deixar o valor do faturamento zerado.");
    }

    faturamento.getGuiasFaturaveis().size();

    return faturamento;
  }
  private static void processarArquivo() throws Exception {
    StringBuffer buffer = new StringBuffer();
    buffer.append("PRESTADOR;GUIA;TIPO DE GUIA;DATA ATENDIMENTO;SITUACAO;VALOR");
    buffer.append(NOVA_LINHA);

    for (Prestador prestador : mapaGuiasPorPrestador.keySet()) {
      for (GuiaSimples guia : mapaGuiasPorPrestador.get(prestador)) {
        buffer.append(prestador.getPessoaJuridica().getFantasia());
        buffer.append(NOVO_CAMPO);
        buffer.append(guia.getAutorizacao());
        buffer.append(NOVO_CAMPO);
        buffer.append(guia.getTipo());
        buffer.append(NOVO_CAMPO);
        buffer.append(Utils.format(guia.getDataAtendimento()));
        buffer.append(NOVO_CAMPO);
        buffer.append(guia.getSituacao().getDescricao());
        buffer.append(NOVO_CAMPO);
        buffer.append(guia.getValorTotal());
        buffer.append(NOVA_LINHA);
      }
    }

    Utils.criarArquivo("c:\\Guias_Por_Prestador.csv", "", buffer);
  }