public boolean runWithEntity(IEntity<?> entity) {
    super.beforeRun();

    boolean result = false;

    /* Verifica se a entidade é compatível */
    /* Verifica se a entidade passada eh um DocumentoCobranca ou pertence eh descendente */
    if (ClassUtils.isAssignable(entity.getInfo().getType(), Contrato.class)) {
      Contrato oContrato = (Contrato) entity.getObject();
      this.cpfCnpj = oContrato.getPessoa().getDocumento();

      /* Alguns dados poderao ser inicializados aqui */
      this.categoriaContratoId = IDAO.ENTITY_UNSAVED;

      /* Define as datas de vencimento e recebimento amplas */
      Calendar dataInicial = CalendarUtils.getCalendar(1900, Calendar.JANUARY, 1);
      Calendar dataAtual = CalendarUtils.getCalendar();

      this.dataVencimentoInicial = (Calendar) dataInicial.clone();
      this.dataVencimentoFinal = (Calendar) dataAtual.clone();

      this.dataRecebimentoInicial = (Calendar) dataInicial.clone();
      this.dataRecebimentoFinal = (Calendar) dataAtual.clone();

      /* Não executa nada, pois o processo gera um PDF e é importante
       * que o operador defina as propriedades do relatório antes de gerar o PDF */
      result = true;
    } else if (ClassUtils.isAssignable(entity.getInfo().getType(), Pessoa.class)) {
      Pessoa oPessoa = (Pessoa) entity.getObject();
      this.cpfCnpj = oPessoa.getDocumento();

      /* Alguns dados poderao ser inicializados aqui */
      this.categoriaContratoId = IDAO.ENTITY_UNSAVED;

      /* Define as datas de vencimento e recebimento amplas */
      Calendar dataInicial = CalendarUtils.getCalendar(1900, Calendar.JANUARY, 1);
      Calendar dataAtual = CalendarUtils.getCalendar();

      this.dataVencimentoInicial = (Calendar) dataInicial.clone();
      this.dataVencimentoFinal = (Calendar) dataAtual.clone();

      this.dataRecebimentoInicial = (Calendar) dataInicial.clone();
      this.dataRecebimentoFinal = (Calendar) dataAtual.clone();

      /* Não executa nada, pois o processo gera um PDF e é importante
       * que o operador defina as propriedades do relatório antes de gerar o PDF */
      result = true;
    } else {
      this.getMessageList()
          .add(
              new BusinessMessage(
                  IRunnableEntityProcess.class,
                  "ENTITY_NOT_COMPATIBLE",
                  PROCESS_NAME,
                  entity.getInfo().getType().getName()));
    }

    return result;
  }
  @Test
  public void quitar() throws Exception {
    /*
     * Cria os parâmetros necessários para o serviço.
     */
    Conta conta = UtilsCrud.objectRetrieve(this.serviceManager, Conta.class, 1l, null);
    Contrato contrato = UtilsCrud.objectRetrieve(this.serviceManager, Contrato.class, 1l, null);
    Operacao operacao = UtilsCrud.objectRetrieve(this.serviceManager, Operacao.class, 1l, null);
    CentroCusto centroCusto =
        UtilsCrud.objectRetrieve(this.serviceManager, CentroCusto.class, 1l, null);
    ItemCusto itemCusto = UtilsCrud.objectRetrieve(this.serviceManager, ItemCusto.class, 1l, null);
    ClassificacaoContabil classificacaoContabil =
        UtilsCrud.objectRetrieve(this.serviceManager, ClassificacaoContabil.class, 1l, null);

    Calendar data = CalendarUtils.getCalendar(2007, Calendar.SEPTEMBER, 18);
    BigDecimal valor = DecimalUtils.TEN;

    Lancamento lancamento =
        UtilsLancamento.inserir(
            this.serviceManager,
            conta,
            contrato,
            data,
            data,
            "",
            operacao,
            Transacao.CREDITO,
            centroCusto,
            classificacaoContabil,
            itemCusto,
            valor,
            null,
            false,
            null);
    /*
     * Executa o serviço.
     */
    ServiceData sd = new ServiceData(QuitarLancamentoService.SERVICE_NAME, null);
    sd.getArgumentList().setProperty(QuitarLancamentoService.IN_CONTA, conta);
    sd.getArgumentList().setProperty(QuitarLancamentoService.IN_DATA, data);
    sd.getArgumentList().setProperty(QuitarLancamentoService.IN_LANCAMENTO, lancamento);
    sd.getArgumentList().setProperty(QuitarLancamentoService.IN_VALOR, valor);
    this.serviceManager.execute(sd);

    /*
     * Recarrega o lançamento para atualização.
     */
    lancamento =
        UtilsCrud.objectRetrieve(this.serviceManager, Lancamento.class, lancamento.getId(), null);

    lancamentoMovimento = (LancamentoMovimento) sd.getFirstOutput();
    assertEquals(conta.toString(), lancamentoMovimento.getConta().toString());
    assertEquals(data, lancamentoMovimento.getData());
    assertEquals(lancamento.toString(), lancamentoMovimento.getLancamento().toString());
    assertEquals(
        LancamentoMovimentoCategoria.QUITADO,
        lancamentoMovimento.getLancamentoMovimentoCategoria());
    assertEquals(valor, lancamentoMovimento.getValor());
    assertEquals(DecimalUtils.getBigDecimal(0), lancamento.getSaldo());
  }
 public String toString() {
   String result = "";
   if (this.ocorrencia != null) {
     result = "Código: " + this.ocorrencia.getCodigo();
     result += " / Descrição: " + this.ocorrencia.getDescricao();
     result += " / Data: " + CalendarUtils.formatDate(this.dataOcorrencia);
   }
   return result;
 }
  @Test
  public void testExecute() throws BusinessException {
    //		String documento = "04175308000129";
    String documento = "";
    Calendar dataInicial = CalendarUtils.getCalendar(2009, Calendar.MARCH, 1);
    Calendar dataFinal = CalendarUtils.getCalendar(2009, Calendar.MARCH, 31);
    //		List<ItemCusto> itemCustoList = UtilsCrud.objectList(this.serviceManager, ItemCusto.class,
    // "nome like 'Material%'", null);
    Situacao situacao = Situacao.TODOS;

    ServiceData sd = new ServiceData(ListarPosicaoContratoService.SERVICE_NAME, null);
    sd.getArgumentList().setProperty(ListarPosicaoContratoService.IN_DOCUMENTO_OPT, documento);
    sd.getArgumentList().setProperty(ListarPosicaoContratoService.IN_CONTA_LIST_OPT, new Long[0]);
    //		sd.getArgumentList().setProperty(ListarPosicaoContratoService.IN_ITEM_CUSTO_LIST_OPT,
    // itemCustoList);
    sd.getArgumentList().setProperty(ListarPosicaoContratoService.IN_DATA_INICIAL_OPT, dataInicial);
    sd.getArgumentList().setProperty(ListarPosicaoContratoService.IN_DATA_FINAL_OPT, dataFinal);
    sd.getArgumentList().setProperty(ListarPosicaoContratoService.IN_SITUACAO_OPT, situacao);
    this.serviceManager.execute(sd);

    List<Lancamento> list = sd.getFirstOutput();
    assertTrue(list.size() > 0);

    System.out.printf("%-6s ", "ID");
    System.out.printf("%-30s ", "Nome");
    System.out.printf("%-30s ", "Descrição");
    System.out.printf("%10s ", "Valor");
    System.out.println();
    //		System.out.println("------ ------------------------------ ");
    for (Lancamento lancamento : list) {
      System.out.printf("%6s ", lancamento.getId());
      System.out.printf("%-30s ", lancamento.getContrato().getPessoa().getNome());
      System.out.printf("%-30s ", lancamento.getDescricao());
      System.out.printf("%10.2f ", lancamento.getSaldo());
      System.out.println();
      //			System.out.println(
      //					lancamento.getId() + " | " +
      //					CalendarUtils.formatDate(lancamento.getData()) + " | " +
      //					lancamento.getLancamentoItens().get(0).getItemCusto());
    }
  }
/**
 * Este processo lista as pendências dos contratos para cobrança.
 *
 * <p><b>Procedimentos:</b>
 *
 * @author Antônio 20070424
 * @version 20070424
 * @spring.bean id="RelatorioRecebimentoProcess" singleton="false"
 * @spring.property name="processManager" ref="ProcessManager"
 */
@ProcessMetadata(
    label = "Relatório de recebimento",
    hint =
        "Gera um relatório com os lançamentos recebimento, seu vencimento, sua data de recebimento e seu valor",
    description =
        "Gera um relatório com os lançamentos recebidos no período, seu vencimento, sua data de recebimento e seu valor.")
public class RelatorioRecebimentoProcess extends ProcessBasic implements IRunnableEntityProcess {
  public static final String PROCESS_NAME = "RelatorioRecebimentoProcess";

  private String itemCustoIdList = null;
  private Boolean itemCustoNot = false;
  private String escritorioContabilIdList = null;
  private Long categoriaContratoId = IDAO.ENTITY_UNSAVED;
  private Long municipioId = IDAO.ENTITY_UNSAVED;
  private Boolean notMunicipio = false;
  private Long contaId = IDAO.ENTITY_UNSAVED;
  private Long contratoRepresentanteId = IDAO.ENTITY_UNSAVED;
  private int tipoContrato = 0;
  //	private Calendar dataLancamentoInicial = CalendarUtils.getCalendar();
  //	private Calendar dataLancamentoFinal = CalendarUtils.getCalendar();
  private Calendar dataVencimentoInicial = CalendarUtils.getCalendar();
  private Calendar dataVencimentoFinal = CalendarUtils.getCalendar();
  private Calendar dataRecebimentoInicial = CalendarUtils.getCalendar();
  private Calendar dataRecebimentoFinal = CalendarUtils.getCalendar();
  private Integer quantidadeItensInicial = null;
  private Integer quantidadeItensFinal = null;
  private String cpfCnpj = null;
  private OutputStream outputStream = null;

  @Override
  public void start() throws ProcessException {
    super.start();
    //		dataLancamentoInicial.set(Calendar.DATE,
    // dataLancamentoInicial.getActualMinimum(Calendar.DATE));
    dataVencimentoInicial.set(Calendar.DATE, dataVencimentoInicial.getActualMinimum(Calendar.DATE));
    dataRecebimentoInicial.set(
        Calendar.DATE, dataRecebimentoInicial.getActualMinimum(Calendar.DATE));
  }

  public void execute() {
    log.debug("Iniciando RelatorioRecebimentoProcess...");
    try {
      ServiceData sd = new ServiceData(RelatorioRecebimentoService.SERVICE_NAME, null);
      sd.getArgumentList()
          .setProperty(RelatorioRecebimentoService.IN_ITEM_CUSTO_ID_LIST, this.itemCustoIdList);
      sd.getArgumentList()
          .setProperty(RelatorioRecebimentoService.IN_ITEM_CUSTO_NOT, this.itemCustoNot);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_ESCRITORIO_CONTABIL_ID_LIST,
              this.escritorioContabilIdList);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_CATEGORIA_CONTRATO_ID, this.categoriaContratoId);
      sd.getArgumentList()
          .setProperty(RelatorioRecebimentoService.IN_TIPO_CONTRATO, this.tipoContrato);
      //			sd.getArgumentList().setProperty(RelatorioRecebimentoService.IN_DATA_LANCAMENTO_INICIAL,
      // this.dataLancamentoInicial);
      //			sd.getArgumentList().setProperty(RelatorioRecebimentoService.IN_DATA_LANCAMENTO_FINAL,
      // this.dataLancamentoFinal);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_DATA_VENCIMENTO_INICIAL, this.dataVencimentoInicial);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_DATA_VENCIMENTO_FINAL, this.dataVencimentoFinal);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_DATA_RECEBIMENTO_INICIAL, this.dataRecebimentoInicial);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_DATA_RECEBIMENTO_FINAL, this.dataRecebimentoFinal);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_QUANTIDADE_ITENS_INICIAL, this.quantidadeItensInicial);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_QUANTIDADE_ITENS_FINAL, this.quantidadeItensFinal);
      sd.getArgumentList().setProperty(RelatorioRecebimentoService.IN_CPF_CNPJ, this.cpfCnpj);
      sd.getArgumentList()
          .setProperty(RelatorioRecebimentoService.IN_MUNICIPIO_ID_OPT, this.municipioId);
      sd.getArgumentList()
          .setProperty(RelatorioRecebimentoService.IN_NOT_MUNICIPIO_OPT, this.notMunicipio);
      sd.getArgumentList().setProperty(RelatorioRecebimentoService.IN_CONTA_ID_OPT, this.contaId);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_CONTRATO_REPRESENTANTE_ID_OPT,
              this.contratoRepresentanteId);
      sd.getArgumentList()
          .setProperty(RelatorioRecebimentoService.IN_OUTPUT_STREAM, this.outputStream);
      sd.getArgumentList()
          .setProperty(
              RelatorioRecebimentoService.IN_APPLICATION_USER_OPT,
              this.getUserSession().getUser().getObject());
      this.getProcessManager().getServiceManager().execute(sd);
      sd.getFirstOutput();

    } catch (BusinessException e) {
      /* Armazenando a lista de erros */
      this.getMessageList().addAll(e.getErrorList());
    }
  }

  /**
   * Constrói uma lista de Categorias de Contratos para ser usada na exibição da página JSF.
   *
   * @return List<SelectItem>
   * @throws BusinessException
   */
  public List<SelectItem> getListCategoriaContrato() throws BusinessException {
    List<SelectItem> result =
        this.getProcessManager()
            .getServiceManager()
            .getEntityManager()
            .getEntitySelectItems(ContratoCategoria.class, "");
    result.add(0, new SelectItem(IDAO.ENTITY_UNSAVED, "(Todos)"));
    return result;
  }

  public List<SelectItem> getListMunicipio() throws BusinessException {
    List<SelectItem> result =
        this.getProcessManager()
            .getServiceManager()
            .getEntityManager()
            .getEntitySelectItems(Municipio.class, "");
    result.add(0, new SelectItem(IDAO.ENTITY_UNSAVED, "(Todos)"));
    return result;
  }

  public List<SelectItem> getListConta() throws BusinessException {
    List<SelectItem> result =
        this.getProcessManager()
            .getServiceManager()
            .getEntityManager()
            .getEntitySelectItems(
                Conta.class,
                " entity.id in (SELECT c.id FROM Conta c inner join c.applicationUsers as user where user.id="
                    + this.getUserSession().getUser().getId()
                    + ")");
    result.add(0, new SelectItem(IDAO.ENTITY_UNSAVED, "(Todas)"));
    return result;
  }

  public List<SelectItem> getListContratoRepresentante() throws BusinessException {
    List<SelectItem> result =
        this.getProcessManager()
            .getServiceManager()
            .getEntityManager()
            .getEntitySelectItems(Representante.class, "");
    result.add(0, new SelectItem(IDAO.ENTITY_UNSAVED, "(Todos)"));
    return result;
  }

  public List<SelectItem> getListTipoContrato() {
    List<SelectItem> result = new ArrayList<SelectItem>(3);
    result.add(
        new SelectItem(
            RelatorioRecebimentoService.TipoContrato.TODOS.ordinal(),
            RelatorioRecebimentoService.TipoContrato.TODOS.getNome()));
    result.add(
        new SelectItem(
            RelatorioRecebimentoService.TipoContrato.ATIVOS.ordinal(),
            RelatorioRecebimentoService.TipoContrato.ATIVOS.getNome()));
    result.add(
        new SelectItem(
            RelatorioRecebimentoService.TipoContrato.INATIVOS.ordinal(),
            RelatorioRecebimentoService.TipoContrato.INATIVOS.getNome()));
    return result;
  }

  public String getProcessName() {
    return PROCESS_NAME;
  }

  public String getItemCustoIdList() {
    return itemCustoIdList;
  }

  public void setItemCustoIdList(String itemCustoIdList) {
    this.itemCustoIdList = itemCustoIdList;
  }

  public Long getCategoriaContratoId() {
    return categoriaContratoId;
  }

  public void setCategoriaContratoId(Long categoriaContratoId) {
    this.categoriaContratoId = categoriaContratoId;
  }

  public int getTipoContrato() {
    return tipoContrato;
  }

  public void setTipoContrato(int tipoContrato) {
    this.tipoContrato = tipoContrato;
  }

  public Integer getQuantidadeItensInicial() {
    return quantidadeItensInicial;
  }

  public void setQuantidadeItensInicial(Integer quantidadeItensInicial) {
    this.quantidadeItensInicial = quantidadeItensInicial;
  }

  public Integer getQuantidadeItensFinal() {
    return quantidadeItensFinal;
  }

  public void setQuantidadeItensFinal(Integer quantidadeItensFinal) {
    this.quantidadeItensFinal = quantidadeItensFinal;
  }

  public String getCpfCnpj() {
    return cpfCnpj;
  }

  public void setCpfCnpj(String cpfCnpj) {
    this.cpfCnpj = cpfCnpj;
  }

  public OutputStream getOutputStream() {
    return outputStream;
  }

  public void setOutputStream(OutputStream outputStream) {
    this.outputStream = outputStream;
  }

  //	public Calendar getDataLancamentoFinal() {
  //		return dataLancamentoFinal;
  //	}
  //
  //	public void setDataLancamentoFinal(Calendar dataLancamentoFinal) {
  //		this.dataLancamentoFinal = dataLancamentoFinal;
  //	}
  //
  //	public Calendar getDataLancamentoInicial() {
  //		return dataLancamentoInicial;
  //	}
  //
  //	public void setDataLancamentoInicial(Calendar dataLancamentoInicial) {
  //		this.dataLancamentoInicial = dataLancamentoInicial;
  //	}

  public Calendar getDataVencimentoFinal() {
    return dataVencimentoFinal;
  }

  public void setDataVencimentoFinal(Calendar dataVencimentoFinal) {
    this.dataVencimentoFinal = dataVencimentoFinal;
  }

  public Calendar getDataVencimentoInicial() {
    return dataVencimentoInicial;
  }

  public void setDataVencimentoInicial(Calendar dataVencimentoInicial) {
    this.dataVencimentoInicial = dataVencimentoInicial;
  }

  public Long getContratoRepresentanteId() {
    return contratoRepresentanteId;
  }

  public void setContratoRepresentanteId(Long contratoRepresentanteId) {
    this.contratoRepresentanteId = contratoRepresentanteId;
  }

  public Long getMunicipioId() {
    return municipioId;
  }

  public void setMunicipioId(Long municipioId) {
    this.municipioId = municipioId;
  }

  public Long getContaId() {
    return contaId;
  }

  public void setContaId(Long contaId) {
    this.contaId = contaId;
  }

  public Calendar getDataRecebimentoFinal() {
    return dataRecebimentoFinal;
  }

  public void setDataRecebimentoFinal(Calendar dataRecebimentoFinal) {
    this.dataRecebimentoFinal = dataRecebimentoFinal;
  }

  public Calendar getDataRecebimentoInicial() {
    return dataRecebimentoInicial;
  }

  public void setDataRecebimentoInicial(Calendar dataRecebimentoInicial) {
    this.dataRecebimentoInicial = dataRecebimentoInicial;
  }

  public Boolean getNotMunicipio() {
    return notMunicipio;
  }

  public void setNotMunicipio(Boolean notMunicipio) {
    this.notMunicipio = notMunicipio;
  }

  /*==============================================================================
   * IRunnableEntityProcess
   *==============================================================================*/

  public boolean runWithEntity(IEntity<?> entity) {
    super.beforeRun();

    boolean result = false;

    /* Verifica se a entidade é compatível */
    /* Verifica se a entidade passada eh um DocumentoCobranca ou pertence eh descendente */
    if (ClassUtils.isAssignable(entity.getInfo().getType(), Contrato.class)) {
      Contrato oContrato = (Contrato) entity.getObject();
      this.cpfCnpj = oContrato.getPessoa().getDocumento();

      /* Alguns dados poderao ser inicializados aqui */
      this.categoriaContratoId = IDAO.ENTITY_UNSAVED;

      /* Define as datas de vencimento e recebimento amplas */
      Calendar dataInicial = CalendarUtils.getCalendar(1900, Calendar.JANUARY, 1);
      Calendar dataAtual = CalendarUtils.getCalendar();

      this.dataVencimentoInicial = (Calendar) dataInicial.clone();
      this.dataVencimentoFinal = (Calendar) dataAtual.clone();

      this.dataRecebimentoInicial = (Calendar) dataInicial.clone();
      this.dataRecebimentoFinal = (Calendar) dataAtual.clone();

      /* Não executa nada, pois o processo gera um PDF e é importante
       * que o operador defina as propriedades do relatório antes de gerar o PDF */
      result = true;
    } else if (ClassUtils.isAssignable(entity.getInfo().getType(), Pessoa.class)) {
      Pessoa oPessoa = (Pessoa) entity.getObject();
      this.cpfCnpj = oPessoa.getDocumento();

      /* Alguns dados poderao ser inicializados aqui */
      this.categoriaContratoId = IDAO.ENTITY_UNSAVED;

      /* Define as datas de vencimento e recebimento amplas */
      Calendar dataInicial = CalendarUtils.getCalendar(1900, Calendar.JANUARY, 1);
      Calendar dataAtual = CalendarUtils.getCalendar();

      this.dataVencimentoInicial = (Calendar) dataInicial.clone();
      this.dataVencimentoFinal = (Calendar) dataAtual.clone();

      this.dataRecebimentoInicial = (Calendar) dataInicial.clone();
      this.dataRecebimentoFinal = (Calendar) dataAtual.clone();

      /* Não executa nada, pois o processo gera um PDF e é importante
       * que o operador defina as propriedades do relatório antes de gerar o PDF */
      result = true;
    } else {
      this.getMessageList()
          .add(
              new BusinessMessage(
                  IRunnableEntityProcess.class,
                  "ENTITY_NOT_COMPATIBLE",
                  PROCESS_NAME,
                  entity.getInfo().getType().getName()));
    }

    return result;
  }

  public String getEscritorioContabilIdList() {
    return escritorioContabilIdList;
  }

  public void setEscritorioContabilIdList(String escritorioContabilIdList) {
    this.escritorioContabilIdList = escritorioContabilIdList;
  }

  public Boolean getItemCustoNot() {
    return itemCustoNot;
  }

  public void setItemCustoNot(Boolean itemCustoNot) {
    this.itemCustoNot = itemCustoNot;
  }
}
  @SuppressWarnings("unchecked")
  public void execute(ServiceData serviceData) throws ServiceException {
    log.debug("::Iniciando a execução do serviço ListarLancamentoMovimentoService");
    try {
      log.debug("Preparando os argumentos");
      /* Obrigatórios */
      String inPropriedadeData =
          (String) serviceData.getArgumentList().getProperty(IN_PROPRIEDADE_DATA);
      int inOrdem = (Integer) serviceData.getArgumentList().getProperty(IN_ORDEM);

      /* Opcionais */
      Long[] inContasId =
          (serviceData.getArgumentList().containsProperty(IN_CONTAS_ID_OPT)
              ? (Long[]) serviceData.getArgumentList().getProperty(IN_CONTAS_ID_OPT)
              : null);
      Calendar inDataInicial =
          (serviceData.getArgumentList().containsProperty(IN_DATA_INICIAL_OPT)
              ? (Calendar) serviceData.getArgumentList().getProperty(IN_DATA_INICIAL_OPT)
              : CalendarUtils.getCalendarBaseDate());
      Calendar inDataFinal =
          (serviceData.getArgumentList().containsProperty(IN_DATA_FINAL_OPT)
              ? (Calendar) serviceData.getArgumentList().getProperty(IN_DATA_FINAL_OPT)
              : null);
      Long inLancamentoId =
          (serviceData.getArgumentList().containsProperty(IN_LANCAMENTO_ID_OPT)
              ? (Long) serviceData.getArgumentList().getProperty(IN_LANCAMENTO_ID_OPT)
              : null);
      Long inDocumentoId =
          (serviceData.getArgumentList().containsProperty(IN_DOCUMENTO_ID_OPT)
              ? (Long) serviceData.getArgumentList().getProperty(IN_DOCUMENTO_ID_OPT)
              : null);
      Long inContratoId =
          (serviceData.getArgumentList().containsProperty(IN_CONTRATO_ID_OPT)
              ? (Long) serviceData.getArgumentList().getProperty(IN_CONTRATO_ID_OPT)
              : null);
      Long inItemCustoId =
          (serviceData.getArgumentList().containsProperty(IN_ITEM_CUSTO_ID_OPT)
              ? (Long) serviceData.getArgumentList().getProperty(IN_ITEM_CUSTO_ID_OPT)
              : null);
      Long inDocumentoCobrancaCategoriaId =
          (serviceData.getArgumentList().containsProperty(IN_DOCUMENTO_COBRANCA_CATEGORIA_ID_OPT)
              ? (Long)
                  serviceData.getArgumentList().getProperty(IN_DOCUMENTO_COBRANCA_CATEGORIA_ID_OPT)
              : null);
      String inCpfCnpj =
          (serviceData.getArgumentList().containsProperty(IN_CPF_CNPJ_OPT)
              ? (String) serviceData.getArgumentList().getProperty(IN_CPF_CNPJ_OPT)
              : null);
      LancamentoMovimentoCategoria inTipoOperacao =
          (serviceData.getArgumentList().containsProperty(IN_TIPO_OPERACAO_OPT)
              ? (LancamentoMovimentoCategoria)
                  serviceData.getArgumentList().getProperty(IN_TIPO_OPERACAO_OPT)
              : null);
      Transacao inTransacao =
          (serviceData.getArgumentList().containsProperty(IN_TIPO_TRANSACAO_OPT)
              ? (Transacao) serviceData.getArgumentList().getProperty(IN_TIPO_TRANSACAO_OPT)
              : null);

      log.debug("Buscando registros");

      /* Montando a clausula SELECT */
      String sqlSelect = QueryLancamentoMovimento.SELECT;
      sqlSelect += " left outer join movimento.lancamento.lancamentos as lancamentos ";

      /* Montando a clausula WHERE */
      String sqlWhere = " where (true = true)";
      if (inContasId != null) {
        String listaContas = "";
        for (int i = 0; i < inContasId.length; i++) {
          if (i > 0) listaContas += ", ";
          listaContas += inContasId[i].toString();
        }
        sqlWhere +=
            " and (lancamentoMovimento." + LancamentoMovimento.CONTA + " in (" + listaContas + "))";
      }
      if (inLancamentoId != null)
        sqlWhere +=
            " and (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + inLancamentoId
                + ")";
      if (inDocumentoId != null)
        sqlWhere +=
            " and (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.DOCUMENTO_PAGAMENTO
                + " = "
                + Long.toString(inDocumentoId)
                + ")";
      if (inContratoId != null)
        sqlWhere +=
            " and (lancamentomovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.CONTRATO
                + " = "
                + Long.toString(inContratoId)
                + ")";
      if (inItemCustoId != null)
        sqlWhere +=
            " and (lancamentos."
                + LancamentoItem.ITEM_CUSTO
                + " = "
                + Long.toString(inItemCustoId)
                + ")";
      if (inDocumentoCobrancaCategoriaId != null && inDocumentoCobrancaCategoriaId != 0)
        sqlWhere +=
            " and (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.DOCUMENTO_PAGAMENTO
                + "."
                + DocumentoCobranca.DOCUMENTO_COBRANCA_CATEGORIA
                + " = "
                + Long.toString(inDocumentoCobrancaCategoriaId)
                + ")";
      if (inCpfCnpj != null)
        sqlWhere +=
            " and (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.CONTRATO
                + "."
                + Contrato.PESSOA
                + "."
                + Pessoa.DOCUMENTO
                + "='"
                + inCpfCnpj
                + "')";
      if (inDataFinal != null)
        sqlWhere +=
            " and (lancamentoMovimento."
                + inPropriedadeData
                + " between '"
                + CalendarUtils.formatToSQLDate(inDataInicial)
                + "' and '"
                + CalendarUtils.formatToSQLDate(inDataFinal)
                + "')";

      if (inTransacao == Transacao.CREDITO) sqlWhere += " and (lancamentoMovimento.valor>=0)";
      else if (inTransacao == Transacao.DEBITO) sqlWhere += " and (lancamentoMovimento.valor<0)";

      /*
       *  Atribui as condições do filtro da Operação
       *  Para cada Tipo de Operação, há duas operações a serem filtradas.
       *  Exemplo: Lançar e Extorno de Lançado.
       */
      if (inTipoOperacao == LancamentoMovimentoCategoria.QUITADO) {
        sqlWhere +=
            " and ((lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + LancamentoMovimentoCategoria.QUITADO
                + ") or (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + LancamentoMovimentoCategoria.QUITADO_ESTORNADO
                + "))";
      }
      if (inTipoOperacao == LancamentoMovimentoCategoria.CANCELADO) {
        sqlWhere +=
            " and ((lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + LancamentoMovimentoCategoria.CANCELADO
                + ") or (lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + " = "
                + LancamentoMovimentoCategoria.CANCELADO_ESTORNADO
                + "))";
      }

      /* Montando a clausula ORDER */
      String sqlOrder = " order by";
      if (inOrdem == ORDEM_DATA) {
        sqlOrder +=
            " lancamentoMovimento."
                + inPropriedadeData
                + ", lancamentoMovimento."
                + IDAO.PROPERTY_ID_NAME;
      }
      if (inOrdem == ORDEM_LANCAMENTO) {
        sqlOrder +=
            " lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + ", lancamentoMovimento."
                + inPropriedadeData
                + ", lancamentoMovimento."
                + IDAO.PROPERTY_ID_NAME;
      }
      if (inOrdem == ORDEM_NOME) {
        sqlOrder +=
            " lancametoMovimento."
                + LancamentoMovimento.LANCAMENTO_MOVIMENTO_CATEGORIA
                + "."
                + Lancamento.CONTRATO
                + "."
                + Contrato.PESSOA
                + "."
                + Pessoa.NOME
                + ", lancamentoMovimento."
                + LancamentoMovimento.LANCAMENTO
                + ", lancamentoMovimento."
                + inPropriedadeData
                + ", lancamentoMovimento."
                + IDAO.PROPERTY_ID_NAME;
      }

      /* Executando serviço da query */
      String sql = sqlSelect.concat(sqlWhere).concat(sqlOrder);
      Query query = serviceData.getCurrentSession().createQuery(sql);
      List<QueryLancamentoMovimento> beanList = query.list();

      log.debug("::Fim da execução do serviço");
      serviceData.getOutputData().add(beanList);

    } catch (BusinessException e) {
      log.fatal(e.getErrorList());
      /* O Serviço não precisa adicionar mensagem local. O Manager já indica qual srv falhou e os parâmetros. */
      throw new ServiceException(e.getErrorList());
    } catch (Exception e) {
      log.fatal(e.getMessage());
      /* Indica que o serviço falhou por causa de uma exceção do hibernate. */
      throw new ServiceException(MessageList.createSingleInternalError(e));
    }
  }